Функции Язык программирования PHP

preg_replace

(PHP 3>= 3.0.9, PHP 4)

preg_replace - выполняет поиск и замену регулярного выражения.

Описание

mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit])

Ищет в subject совпадения с pattern и замещает их replacement. Если limit специфицирован, то замещаются только limit совпадений; если limit опущен или равен -1, замещаются все совпадения.

Replacement может содержать ссылку в форме \\n или (начиная с PHP 4.0.4) $n, где последняя форма предпочтительнее. Каждая такая ссылка замещается текстом, захваченным n'ным патэрном в скобках. n может быть от 0 до 99, а \\0 или $0 ссылаются на текст, совпавший со всем патэрном. Открывающие скобки подсчитываются слева направо (начиная с 1) для получения количества захватывающих субпатэрнов.

Если совпадения найдены, возвращается новый subject, иначе subject возвращается без изменений.

Каждый параметр preg_replace() может быть массивом.

Если subject это массив, то поиск и замена выполняются в каждом вхождении subject, return-значение также будет массивом.

Если pattern и replacement являются массивами, то preg_replace() принимает значение из каждого массива и использует их для выполнения поиска и замены в subject. Если replacement имеет меньше значений, чем pattern, то для оставшихся значений для замены используется пустая строка. Если pattern это массив, а replacement это строка, то эта замещающая строка используется для каждого значения pattern. Обратное не будет иметь смысла.

Модификатор /e делает так, что preg_replace() рассматривает параметр replacement как PHP-код после выполнения соответствующей замены ссылок.
Подсказка: убедитесь, что replacement образует строку правильного PHP-кода, иначе PHP сообщит об ошибке разбора в строчке с preg_replace().

Пример 1. Замена различных значений
$patterns 
= array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/"); $replace 
= array ("\\3/\\4/\\1\\2", "$\\1 ="); print preg_replace ($patterns, $replace, 
"{startDate} = 1999-5-27");

Этот пример даст:

$startDate 
= 5/27/1999
Пример 2. Использование модификатора /e
preg_replace ("/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtoupper('\\2').'\\3'", 
$html_body);

Это переведёт в верхний регистр все тэги HTML в тексте ввода.

Пример 3. Конвертация HTML в текст
// $document должен содержать HTML-документ. // Здесь будут удалены тэги 
HTML, разделы javascript // и пустое пространство. Также некоторые обычные элементы 
// HTML конвертируются в их текстовые эквиваленты. $search = array ("'<script[^>]*?>.*?</script>'si", 
// Вырезается javascript "'<[\/\!]*?[^<>]*?>'si", // Вырезаются 
html-тэги "'([\r\n])[\s]+'", // Вырезается пустое пространство "'&(quot|#34);'i", 
// Замещаются html-элементы "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", 
"'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", 
"'&(copy|#169);'i", "'&#(\d+);'e"); // вычисляется как php $replace = 
array ("", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), 
chr(163), chr(169), "chr(\\1)"); $text = preg_replace ($search, $replace, $document);

Примечание: параметр limit был введён после PHP 4.0.1pl2.

См. также preg_match(), preg_match_all() и preg_split().


Назад Оглавление Вперёд
preg_replace_callback Вверх preg_split

Синтаксис Патэрна

Отличия от Perl

Эти отличия даны относительно Perl 5.005.

  1. По умолчанию пробельным символом считается любой таковой символ, распознаваемый функцией isspace() библиотеки С, хотя возможна компиляция PCRE с альтернативной таблицей типов символов. Нормально isspace() распознаёт space, formfeed, newline, carriage return, horizontal tab и vertical tab. Perl 5 больше не включает vertical tab в набор пробельных символов. Мнемоника \v, которая долгое время была в документации Perl, фактически никогда не распознавалась. Однако сам по себе этот символ рассматривался как пробельный как минимум до версии 5.002. В 5.004 и 5.005 он не соответствует \s.

  2. PCRE не разрешает повторение квантификаторов или опережающих утверждений/lookahead assertions. Perl разрешает их, но они имеют другое значение. Например, (?!a){3} не утверждает, что три последующие символа не "a". Оно просто утверждает три раза, что следующий символ не "a".

  3. Захваты субпатэрнов, которые возникают внутри отрицательного опережающего утверждения, вычисляются, но их вхождения в векторе смещения никогда не устанавливаются. Perl устанавливает свои числовые переменные из любого такого патэрна, который совпадает до неудачи утверждения при совпадении с чем-либо (продолжая таким образом), но только если негативное опережающее утверждение содержит одну ветвь.

  4. Хотя двоичные нулевые символы поддерживаются в строке-субъекте, они не допускаются в строке патэрна, поскольку он передаётся как нормальная C-строка, оканчивающаяся нулём. Замена "\\x00" может использоваться в патэрне для представления бинарного нуля.