- PHP preg_replace() Function
- Definition and Usage
- Syntax
- Parameter Values
- Technical Details
- preg_replace
- Список параметров
- Возвращаемые значения
- Ошибки
- Список изменений
- Примеры
- Примечания
- Смотрите также
- Регулярные выражения в PHP часть 1 (preg_replace)
- Операторы повторения
- Ограничение жадности
- Группирующие круглые скобки
- Квадратные скобки
- Экранировка спецсимволов
- Ограничители
PHP preg_replace() Function
Use a case-insensitive regular expression to replace Microsoft with W3Schools in a string:
$str = ‘Visit Microsoft!’;
$pattern = ‘/microsoft/i’;
echo preg_replace($pattern, ‘W3Schools’, $str);
?>?php
Definition and Usage
The preg_replace() function returns a string or array of strings where all matches of a pattern or list of patterns found in the input are replaced with substrings.
There are three different ways to use this function:
1. One pattern and a replacement string. Matches of the pattern are replaced with the replacement string.
2. An array of patterns and a replacement string. Matches any of the patterns are replaced with the replacement string.
3. An array of patterns and an array of replacement strings. Matches of each pattern are replaced with the replacement string at the same position in the replacements array. If no item is found at that position the match is replaced with an empty string.
Replacement strings may contain a backreference in the form \n or $n where n is the index of a group in the pattern. In the returned string, instances of \n and $n will be replaced with the substring that was matched by the group or, if \0 or $0 are used, by the whole expression.
Note: For each input string, the function evaluates the patterns in the order that they are given. The result of evaluating the first pattern on the string is used as the input string for the second pattern and so on. This can lead to unexpected behaviour.
Syntax
Parameter Values
Parameter | Description |
---|---|
patterns | Required. Contains a regular expression or array of regular expressions |
replacements | Required. A replacement string or an array of replacement strings |
input | Required. The string or array of strings in which replacements are being performed |
limit | Optional. Defaults to -1, meaning unlimited. Sets a limit to how many replacements can be done in each string |
count | Optional. After the function has executed, this variable will contain a number indicating how many replacements were performed |
Technical Details
Return Value: | Returns a string or an array of strings resulting from applying the replacements to the input string or strings |
---|---|
PHP Version: | 4.0.5+ |
Changelog: | PHP 5.1.0 — The count parameter was added |
❮ PHP RegExp Reference
preg_replace
Выполняет поиск совпадений в строке subject с шаблоном pattern и заменяет их на replacement .
Список параметров
Искомый шаблон. Может быть как строкой, так и массивом строк.
Также доступны некоторые модификаторы PCRE, включая устаревший ‘e‘ (PREG_REPLACE_EVAL), специфичный только для этой функции.
Строка или массив строк для замены. Если этот параметр является строкой, а pattern является массивом, все шаблоны будут заменены этой строкой. Если и pattern и replacement являются массивами, каждый элемент pattern будет заменен соответствующим элементом из replacement . Если массив replacement содержит меньше элементов, чем массив pattern , то все лишние шаблоны из pattern будут заменены пустыми строками.
replacement может содержать ссылки вида \\ n , либо (начиная с PHP 4.0.4) $ n , причем последний вариант предпочтительней. Каждая такая ссылка будет заменена на подстроку, соответствующую n -ой подмаске. n может принимать значения от 0 до 99, причем ссылка \\0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы. Для использования обратного слеша, его необходимо продублировать (строка PHP «\\\\»).
При замене по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра (например, установка цифры сразу после совпавшей маски). В таком случае нельзя использовать знакомую нотацию вида \\1 для ссылки на подмаски. Запись, например, \\11, смутит preg_replace() , так как она не сможет понять, хотите ли вы использовать ссылку \\1, за которой следует цифра 1 или же вы хотите просто использовать ссылку \\11, за которой ничего не следует. Это недоразумение можно устранить, если воспользоваться конструкцией \$1, использующей изолированную ссылку $1, и следующую за ней цифру 1.
При использовании устаревшего модификатора e эта функция экранирует некоторые символы (а именно ‘, «, \ и NULL) в строках, замещающих обратные ссылки. Это сделано для удостоверения корректности синтаксиса при использовании обратных ссылок внутри одинарных или двойных кавычек (например, ‘strlen(\’$1\’)+strlen(«$2»)’). Убедитесь, что вы владеете синтаксисом обработки строк PHP для того, чтобы точно осознавать, как будет выглядеть интерпретированная строка.
Строка или массив строк для поиска и замены.
Если subject является массивом, то поиск с заменой осуществляется для каждого элемента массива subject , а возвращаемое значение также будет являться массивом.
Максимально возможное количество замен каждого шаблона для каждой строки subject . По умолчанию равно -1 (без ограничений).
Если указана, то эта переменная будет заполнена количеством произведенных замен.
Возвращаемые значения
preg_replace() возвращает массив, если параметр subject является массивом, иначе возвращается строка.
Если найдены совпадения, возвращается новая версия subject , иначе subject возвращается нетронутым, в случае ошибки возвращается NULL .
Ошибки
При использовании устаревшего модификатора «\e» бросается ошибка уровня E_DEPRECATED .
Список изменений
Версия | Описание |
---|---|
5.5.0 | Модификатор /e теперь считается устаревшим. Используйте функцию preg_replace_callback() . Смотрите документацию PREG_REPLACE_EVAL с дополнительной информацией и описанием проблем с безопасностью. |
5.1.0 | Добавлен параметр count |
Примеры
Пример #1 Использование подмасок, за которыми следует цифра
$string = ‘April 15, 2003’ ;
$pattern = ‘/(\w+) (\d+), (\d+)/i’ ;
$replacement = ‘$1,$3’ ;
echo preg_replace ( $pattern , $replacement , $string );
?>?php
Результат выполнения данного примера:
Пример #2 Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()
$string = ‘The quick brown fox jumped 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 );
?>?php
Результат выполнения данного примера:
The bear black slow jumped over the lazy dog.
Отсортировав по ключам шаблоны и замены, получаем желаемый результат:
ksort ( $patterns );
ksort ( $replacements );
echo preg_replace ( $patterns , $replacements , $string );
?>?php
Результат выполнения данного примера:
The slow black bear jumped over the lazy dog.
Пример #3 Замена по нескольким шаблонам
Результат выполнения данного примера:
Пример #4 Чистка пробелов
Этот пример вычищает лишние пробелы в строке.
$str = ‘foo o’ ;
$str = preg_replace ( ‘/\s\s+/’ , ‘ ‘ , $str );
// Это теперь будет ‘foo o’
echo $str ;
?>?php
Пример #5 Использование параметра count
echo preg_replace (array( ‘/\d/’ , ‘/\s/’ ), ‘*’ , ‘xp 4 to’ , — 1 , $count );
echo $count ; //3
?>
Результат выполнения данного примера:
Примечания
Замечание:
При использовании массивов в pattern и replacement , ключи обрабатываются в том порядке, в котором они находятся в массиве. Этот порядок не всегда совпадает с числовым порядком индексов. Если вы используете индексы для сопоставления друг с другом нужного pattern и replacement , то вам необходимо прогнать через функцию ksort() оба массива перед использованием preg_replace() .
Смотрите также
- «Регулярные выражения PCRE»
- preg_quote() — Экранирует символы в регулярных выражениях
- preg_filter() — Производит поиск и замену по регулярному выражению
- preg_match() — Выполняет проверку на соответствие регулярному выражению
- preg_replace_callback() — Выполняет поиск по регулярному выражению и замену с использованием callback-функции
- preg_split() — Разбивает строку по регулярному выражению
- preg_last_error() — Возвращает код ошибки выполнения последнего регулярного выражения PCRE
Регулярные выражения в PHP часть 1 (preg_replace)
Регулярные выражения в PHP — это мощный инструмент, который в умелых руках может творить чудеса. Знание регулярных выражений не слишком важно для создания сайтов, потому что они довольно редко встречаются в проектах. Но некоторые особо важные функции просто невозможно сделать без них. Поэтому стоит хотя бы ознакомиться с темой.
Пользуйтесь регулярными выражениями только в том случае, если нет никакого другого способа решения задачи.
Типичная жизненная ситуация:
У программиста была одна проблема. Он решил эту проблему с помощью регулярного выражения. Теперь у программиста есть две проблемы!
Регулярные выражения лучше всего начать изучать с функции preg_replace. Эта функция очень похожа по своей функции на str_replace, которая заменяет часть строки на другую строку. Только на первым параметром функции preg_replace является регулярное выражение. Попробуем сравнить их простейшее использование
- «i» означает отключение чувствительности к регистру искомого символа
- «u» означает, что нужно включить в функции preg_replace поддержку UTF-8 кодировки. Иначе кириллица будет обрабатываться неправильно
ТиШе, мыШи, кот на крыШе ТиШе, мыШи, кот на крыШе
Но сила регулярных выражений в том, что в искомой строке можно задавать символы-команды. Приведём пример: буквы и цифры внутри регулярного выражения будут искаться и заменяться как есть, но символ точки «.» буде восприниматься как любой символ. То есть:
Тише, МЫШИ, кот на крыше Тише, мыши, кот на сыре
Операторы повторения
- + — символ повторяется один или более раз
- * — символ повторяется ноль или более раз
- ? — символ повторяется ноль или один раз. То есть может присутствовать или нет
Ограничение жадности
Регулярное выражение захватывает максимально возможное количество символов. Поэтому результат может быть неожиданным. К примеру. предположим, что нам надо заменить в строке «Тише, мыши, кот на крыше» слово «Тише» на «Громче». Для этого используем выражение:
Может показаться, что выражение сработает правильно. Но по факту оно найдёт букву «Т» в начале строки и букву «е» не в конце первого слова, а в конце всей строки. Результат получится такой:
Чтобы этого не происходило, необходимо ограничить жадность регулярного выражения. Для этого необходимо после оператора повторения (звёздочки «*» или плюса «+») поставить знак вопроса «?», чтобы они перестали быть такими жадными.
Группирующие круглые скобки
Как было сказано ранее, операторы повторения работают только на символ, который стоит до них. Если же необходимо применить оператор повторения на несколько символов, то необходимо поставить скобки. Приведём пример:
Из кода видно, что оператор повторения будет применяться к двум символам, стоящим в круглых скобках — (ыш). Результат выполнения такого кода:
Квадратные скобки
Существуют квадратные скобки. Если круглые являются «группирующими», или в терминах логики они делают соединение «и», то квадратные скобки — это логическое «или». Приведём пример:
В результате выполнения этого кода все буквы «н», «ш», «р», которые стоят в квадратных скобках [ншр] будут заменены на восклицательный знак «!».
Существует ещё возможность сделать отрицание в квадратных скобках. Тогда будут заменены все символы, которые в них не попали. Это делается с помощью значка возведения в степень «^»:
- [а-я] — все строчные буквы
- [а-д] — строчные буквы от «а» до «д»: а, б, в, г, д
- [а-яА-Я] — все строчные и заглавные буквы
- 9 — все цифры
- 6 — цифры: 4, 5, 6, 7
Экранировка спецсимволов
Не являются спецсимволами:
@ : , ‘ » ; — _ = < >% # ~ `& ! /
К примеру, необходимо заменить все знаки «+» в строке. Но в регулярном выражении «+» является оператором повторения. Чтобы снять с него все функции и сделать простым символом, как буквы или цифры, необходимо поставить перед ним знак падающего слеша «\», чтобы получилось «\+»:
В таком случае говорят, что знак «+» экранирован, поэтому не воспринимается как спецсимвол. Результат будет таким:
Ограничители
По бокам регулярного выражения мы ставили ограничители «#». Но ограничителем может быть не только символ решётки, но и другие спецсимволы. К примеру: «/», «&» и даже скобки «(» . «)». Всё зависит от того, что мы хотим использовать внутри выражения. Если будет использована решётка, то внутри её придётся экранировать. Но если поставить ограничители «&», то решётку внутри них не придётся экранировать:
Тише, мыши, кот на крыше Тише, мыши, кот на крыше