Files
php-doc-ru/reference/pcre/functions/preg-replace.xml
Alexey Pyltsyn 39370f677f PCRE: improvements
git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@344324 c90b9560-bf6c-de11-be94-00142212c4b1
2018-02-21 10:53:46 +00:00

386 lines
15 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 95bdd6883b5dde9504701777ba81b3c5f15df52b Maintainer: shein Status: ready -->
<!-- Reviewed: yes -->
<!-- $Revision$ -->
<refentry xml:id="function.preg-replace" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>preg_replace</refname>
<refpurpose>Выполняет поиск и замену по регулярному выражению</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>mixed</type><methodname>preg_replace</methodname>
<methodparam><type>mixed</type><parameter>pattern</parameter></methodparam>
<methodparam><type>mixed</type><parameter>replacement</parameter></methodparam>
<methodparam><type>mixed</type><parameter>subject</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>limit</parameter><initializer>-1</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter role="reference">count</parameter></methodparam>
</methodsynopsis>
<para>
Выполняет поиск совпадений в строке <parameter>subject</parameter> с шаблоном
<parameter>pattern</parameter> и заменяет их на
<parameter>replacement</parameter>.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>pattern</parameter></term>
<listitem>
<para>
Искомый шаблон. Может быть как строкой, так и массивом строк.
</para>
<para>
Также доступны некоторые <link linkend="reference.pcre.pattern.modifiers">модификаторы PCRE</link>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>replacement</parameter></term>
<listitem>
<para>
Строка или массив строк для замены. Если этот параметр является
строкой, а <parameter>pattern</parameter> является массивом,
все шаблоны будут заменены этой строкой. Если и
<parameter>pattern</parameter> и <parameter>replacement</parameter>
являются массивами, каждый элемент <parameter>pattern</parameter> будет
заменен соответствующим элементом из <parameter>replacement</parameter>.
Если массив <parameter>replacement</parameter> содержит меньше
элементов, чем массив <parameter>pattern</parameter>, то все
лишние шаблоны из <parameter>pattern</parameter> будут
заменены пустыми строками.
</para>
<para>
<parameter>replacement</parameter> может содержать ссылки вида
<literal>\\<replaceable>n</replaceable></literal>, либо
<literal>$<replaceable>n</replaceable></literal>,
причем последний вариант предпочтительней. Каждая такая ссылка
будет заменена на подстроку, соответствующую
<replaceable>n</replaceable>-ой подмаске.
<replaceable>n</replaceable> может принимать значения от 0
до 99, причем ссылка <literal>\\0</literal> (либо
<literal>$0</literal>) соответствует вхождению всего шаблона.
Подмаски нумеруются слева направо, начиная с единицы.
Для использования обратного слеша, его необходимо продублировать
(строка PHP <literal>"\\\\"</literal>).
</para>
<para>
При замене по шаблону с использованием ссылок на подмаски
может возникнуть ситуация, когда непосредственно за маской
следует цифра (например, установка цифры сразу после совпавшей маски).
В таком случае нельзя использовать знакомую нотацию вида
<literal>\\1</literal> для ссылки на подмаски.
Запись, например, <literal>\\11</literal>, смутит
<function>preg_replace</function>, так как она не сможет понять,
хотите ли вы использовать ссылку <literal>\\1</literal>, за
которой следует цифра <literal>1</literal> или же вы хотите
просто использовать ссылку <literal>\\11</literal>, за которой
ничего не следует. Это недоразумение можно устранить, если
воспользоваться конструкцией <literal>${1}1</literal>,
использующей изолированную ссылку <literal>$1</literal>, и
следующую за ней цифру <literal>1</literal>.
</para>
<para>
При использовании устаревшего модификатора <literal>e</literal> эта
функция экранирует некоторые символы (а именно
<literal>'</literal>, <literal>"</literal>,
<literal>\</literal> и NULL) в строках, замещающих обратные
ссылки. Это сделано для удостоверения корректности синтаксиса
при использовании обратных ссылок внутри одинарных или двойных
кавычек (например, <literal>'strlen(\'$1\')+strlen("$2")'</literal>).
Убедитесь, что вы владеете <link linkend="language.types.string">синтаксисом
обработки строк</link> PHP для того, чтобы точно осознавать,
как будет выглядеть интерпретированная строка.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>subject</parameter></term>
<listitem>
<para>
Строка или массив строк для поиска и замены.
</para>
<para>
Если <parameter>subject</parameter> является массивом, то
поиск с заменой осуществляется для каждого элемента
массива <parameter>subject</parameter>, а возвращаемое значение
также будет являться массивом.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>limit</parameter></term>
<listitem>
<para>
Максимально возможное количество замен каждого шаблона
для каждой строки <parameter>subject</parameter>.
По умолчанию равно <literal>-1</literal> (без ограничений).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>count</parameter></term>
<listitem>
<para>
Если указана, то эта переменная будет заполнена количеством
произведенных замен.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
<function>preg_replace</function> возвращает массив, если
параметр <parameter>subject</parameter> является массивом, иначе
возвращается строка.
</para>
<para>
Если найдены совпадения, возвращается новая версия <parameter>subject</parameter>,
иначе <parameter>subject</parameter> возвращается нетронутым, в
случае ошибки возвращается &null;.
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
С версии PHP 5.5.0, если передается модификатор "\e", вызывается
ошибка уровня <constant>E_DEPRECATED</constant>. С версии PHP 7.0.0 в этом случае
выдается <constant>E_WARNING</constant> и сам модификатор игнорируется.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>7.0.0</entry>
<entry>
Удалена поддержка модификатора <literal>/e</literal>.
Вместо него используйте <function>preg_replace_callback</function>.
</entry>
</row>
<row>
<entry>5.5.0</entry>
<entry>
Модификатор <literal>/e</literal> теперь считается устаревшим. Используйте
функцию <function>preg_replace_callback</function>. Смотрите
документацию <link linkend="reference.pcre.pattern.modifiers.eval">PREG_REPLACE_EVAL</link>
с дополнительной информацией и описанием проблем с безопасностью.
</entry>
</row>
<row>
<entry>5.1.0</entry>
<entry>
Добавлен параметр <parameter>count</parameter>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Использование подмасок, за которыми следует цифра</title>
<programlisting role="php">
<![CDATA[
<?php
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
April1,2003
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Использование массивов с числовыми индексами в качестве аргументов функции <function>preg_replace</function></title>
<programlisting role="php">
<![CDATA[
<?php
$string = 'The quick brown fox jumps over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
The bear black slow jumps over the lazy dog.
]]>
</screen>
<para>
Отсортировав по ключам шаблоны и замены, получаем желаемый результат:
</para>
<programlisting role="php">
<![CDATA[
<?php
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
The slow black bear jumps over the lazy dog.
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Замена по нескольким шаблонам</title>
<programlisting role="php">
<![CDATA[
<?php
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
$startDate = 5/27/1999
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Чистка пробелов</title>
<para>
Этот пример вычищает лишние пробелы в строке.
</para>
<programlisting role="php">
<![CDATA[
<?php
$str = 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);
// Это теперь будет 'foo o'
echo $str;
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Использование параметра <parameter>count</parameter></title>
<programlisting role="php">
<![CDATA[
<?php
$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
echo $count; //3
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
xp***to
3
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
При использовании массивов в <parameter>pattern</parameter> и
<parameter>replacement</parameter>, ключи обрабатываются в том
порядке, в котором они находятся в массиве. Этот порядок
<emphasis>не всегда</emphasis> совпадает с числовым порядком
индексов. Если вы используете индексы для сопоставления
друг с другом нужного <parameter>pattern</parameter> и
<parameter>replacement</parameter>, то вам необходимо прогнать
через функцию <function>ksort</function> оба массива перед
использованием <function>preg_replace</function>.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="pcre.pattern">Регулярные выражения PCRE</link></member>
<member><function>preg_quote</function></member>
<member><function>preg_filter</function></member>
<member><function>preg_match</function></member>
<member><function>preg_replace_callback</function></member>
<member><function>preg_split</function></member>
<member><function>preg_last_error</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->