Регулярные выражения php
Содержание:
- «Петя любит Дашу».replace(/Дашу|Машу|Сашу/, «Катю») ¶
- Квадратные скобки ‘[‘ и ‘]’
- Операторы повторения
- PHP regex exact word match
- Функции для работы с регулярными выражениями
- Практические примеры сложных регулярных выражений
- PHP regex quantifiers
- Регулярные выражения в разных языках программирования
- Регулярные выражения PHP
- Опережающие и ретроспективные проверки — (?=) and (?
- Заключение
- Регулярные выражения в PHP
- str.replace(str|regexp, str|func)
«Петя любит Дашу».replace(/Дашу|Машу|Сашу/, «Катю») ¶
Не трудно догадаться, что результатом работы js-выражения выше будет текст . Даже, если Петя неровно дышит к Маше или Саше, то результат всё равно не изменится.
Рассмотрим базовые спец. символы, которые можно использовать в шаблонах:
Символ | Описание | Пример использования | Результат |
---|---|---|---|
\ | Символ экранирования или начала мета-символа | /путь\/к\/папке/ | Надёт текст |
^ | Признак начала строки | /^Дом/ | Найдёт все строки, которые начинаются на |
$ | Признак конца строки | /родной$/ | Найдёт все строки, которые заканчиваются на |
. | Точка означает любой символ, кроме перевода строки | /Петя ..бит Машу/ | Найдёт как , так и |
| | Означает ИЛИ | /Вася|Петя/ | Найдёт как Васю, так и Петю |
? | Означает НОЛЬ или ОДИН раз | /Вжу?х/ | Найдёт и |
* | Означает НОЛЬ или МНОГО раз | /Вжу*х/ | Найдёт , , , и т.д. |
+ | Означает ОДИН или МНОГО раз | /Вжу+х/ | Найдёт , , и т.д. |
Помимо базовых спец. символов есть мета-символы (или мета-последовательности), которые заменяют группы символов:
Символ | Описание | Пример использования | Результат |
---|---|---|---|
\w | Буква, цифра или _ (подчёркивание) | /^\w+$/ | Соответствует целому слову без пробелов, например |
\W | НЕ буква, цифра или _ (подчёркивание) | /\W\w+\W/ | Найдёт полное слово, которое обрамлено любыми символами, например |
\d | Любая цифра | /^\d+$/ | Соответствует целому числу без знака, например |
\D | Любой символ НЕ цифра | /^\D+$/ | Соответствует любому выражению, где нет цифр, например |
\s | Пробел или табуляция (кроме перевода строки) | /\s+/ | Найдёт последовательность пробелов от одного и до бесконечности |
\S | Любой символ, кроме пробела или табуляции | /\s+\S/ | Найдёт последовательность пробелов, после которой есть хотя бы один другой символ |
\b | Граница слова | /\bдом\b/ | Найдёт только отдельные слова , но проигнорирует |
\B | НЕ граница слова | /\Bдом\b/ | Найдёт только окночние слов, которые заканчиваются на |
\R | Любой перевод строки (Unix, Mac, Windows) | /.*\R/ | Найдёт строки, которые заканчиваются переводом строки |
Нужно отметить, что спец. символы \w, \W, \b и \B не работают по умолчанию с юникодом (включая кириллицу). Для их правильной работы нужно указывать модификатор . К сожалению, на окончание 2019 года JavaScript не поддерживает регулярные выражения для юникода даже с модификатором, поэтому в js эти мета-символы работают только для латиницы.
Ещё регулярные выражения поддерживают разные виды скобочек:
Выражение | Описание | Пример использования | Результат |
---|---|---|---|
(…) | Круглые скобки означают под-шаблон, который идёт в результат поиска | /(Петя|Вася|Саша) любит Машу/ | Найдёт всю строку и запишет воздыхателя Маши в результат поиска под номером 1 |
(?:…) | Круглые скобки с вопросом и двоеточием означают под-шаблон, который НЕ идёт в результат поиска | /(?:Петя|Вася|Саша) любит Машу/ | Найдёт только полную строку, воздыхатель останется инкогнито |
(?P<name>…) | Задаёт имя под-шаблона | /(?P<воздыхатель>Петя|Вася|Саша) любит Машу/ | Найдёт полную строку, а воздыхателя запишет в результат под индексом 1 и ‘воздыхатель’ |
Квадратные скобки задают ЛЮБОЙ СИМВОЛ из последовательности (включая спец. символы \w, \d, \s и т.д.) | /^+$/ | Соответствует любому выражению , но не | |
Если внутри квадратных скобок указать минус, то это считается диапазоном | /+/ | Аналог /\w/ui для JavaScript | |
Если минус является первым или последним символом диапазона, то это просто минус | /+/ | Найдёт любое целое числое с плюсом или минусом (причём не обязательно, чтобы минус или плюс были спереди) | |
Квадратные скобки с «крышечекой» означают любой символ НЕ входящий в диапазон | //i | Найдёт любой символ, который не является буквой, числом или пробелом | |
] | Квадратные скобки в квадратных скобках задают класс символов (alnum, alpha, ascii, digit, print, space, punct и другие) | /]+/ | Найдёт последовательность непечатаемых символов |
{n} | Фигурные скобки с одним числом задают точное количество символов | /\w+н{2}\w+/u | Найдёт слово, в котором две буквы н |
{n,k} | Фигурные скобки с двумя числами задают количество символов от n до k | /\w+н{1,2}\w+/u | Найдёт слово, в котором есть одна или две буквы н |
{n,} | Фигурные скобки с одним числом и запятой задают количество символов от n до бесконечности | /\w+н{3,}\w+/u | Найдёт слово, в котором н встречается от трёх и более раз подряд |
Квадратные скобки ‘[‘ и ‘]’
Группы символов \s, \S, \w, \W, \d, \D не очень гибкие.
Даже такая простая задача, как найти все буквы (но не цифры) не может быть решена ими.
Давайте посмотрим, что еще могут предложить нам регулярные выражения.
А предлагают они нам квадратные скобки ‘[‘ и ‘]’, которые представляют собой операцию ‘или’:
Но этим их возможности далеко не исчерпаны. С помощью шляпки ‘^’ мы можем сделать отрицание:
Что можно еще:
-
Можно задавать группы символов: задаст маленькие латинские буквы,
– большие, – цифру от 0 до 9. -
Посложнее: – большие и маленькие латинские буквы, то же
самое плюс цифры — , и так далее. Порядок значения не имеет,
нет разницы или . -
Еще посложнее: — цифра от 2-х до 5-ти (обе включительно), –
буквы от ‘a’ до ‘c’ по алфавиту (то есть ‘a’, ‘b’, ‘c’) и так далее.
Особенности:
. Шляпка — это спецсимвол внутри (снаружи, кстати, тоже).
Если вам нужна шляпка как символ — просто поставьте ее не в начале
(она спецсимвол только вначале: – так спецсимвол, а — так уже нет!).
Можно не убирать шляпку с первого места, а просто
заэкранировать ее с помощью обратного слеша, и она станет обозначать саму себя:
. Дефис — тоже спецсимвол внутри (а вот снаружи — нет!).
Если вам нужен сам дефис как символ — то поставьте его там, где он не будет воспринят как разделитель группы.
Почему это важно: вы можете сделать группу символов, сами не заметив
этого. К примеру, вот так — » — вы думаете, что выбираете двоеточие, дефис
и собаку @, а на самом деле получается группа символов между : и @
В эту группу
входят следующие символы: «:, ;, , ?».
Откуда они взялись?
Из таблицы ASCII — двоеточие имеет номер меньше, чем собака — и получается группа.
То есть все группы получаются по таблице ASCII (при желании этим можно пользоваться).
Как с этим бороться: поставьте символ дефиса там, где он точно не будет
воспринят как символ группы, например, в начале или в конце (то есть после или перед ):
Можно сделать и так:
Можно также заэкранировать дефис — тогда он будет обозначать сам
себя независимо от позиции. Например, вместо » написать » —
и группы уже не будет, а будут три символа — двоеточие, дефис
и собака @.
. Спецсимволы внутри становятся обычными символами (значит их не надо экранировать обратным слешем!).
. Исключение из предыдущего: имеют свои спецсимволы — это ‘^’ и ‘-‘,
кроме того, если вам нужны квадратные скобки как символы внутри —
то их нужно экранировать обратным слешем.
. Еще исключение: группы символов \s, \S, \w, \W, \d, \D (и другие аналогичные)
будут обозначать именно группы, то есть по-прежнему будут командами.
. Операторы повторений записываются сразу после (их не надо брать в круглые скобки):
Иногда один и тот же эффект можно получить и группами \s, \S, \w, \W, \d, \D, и скобками [].
Когда пользоваться группами, а когда []?
Пользуйтесь тем, что записывается короче и выглядит проще: \w проще, чем ,
а \d – короче, чем .
Хотя вторые варианты могут быть нагляднее ( сразу понятно, а \d – еще нужно вспомнить, что это).
Но в случае ‘цифры от 2-x до 5-ти’ — можно сделать только так:
или, что длиннее, можно и так: . Тоже вариант, но уж очень длинно.
Операторы повторения
Иногда мы хотим указать, что какой-нибудь символ повторяется определенное число раз. Когда мы знаем это число точно, то просто пишем (‘#aaaa#’). Но как поступить, если мы желаем повторить один либо больше раз?
Вопрос решается с помощью операторов повторения (квантификаторов): плюс ‘+’ (один и больше раз), потом звездочка ‘*’ (ноль и больше раз), а затем вопрос ‘?’ (ноль либо один раз, то есть может быть, а может и не быть).
Эти операторы действуют на символ, который непосредственно стоит перед ними.
Для наилучшего понимания стоит рассмотреть пример:
В коде выше шаблон поиска выглядит следующим образом: буква ‘x’, потом ‘a’ один либо больше раз, потом ‘x’.
В этом случае шаблон поиска будет выглядеть следующим образом: буква ‘x’, буква ‘a’ ноль либо больше раз, буква ‘x’. То есть буквы ‘a’ либо нет, либо она повторяется один и больше раз.
Кроме самого очевидного варианта xax xaax xaaax, также подпадает подстрока ‘xx’, ведь там не существует буквы ‘a’ вообще (то есть ноль раз).
Также под шаблон не подпал и ‘xbx’. Это связано с тем, что отсутствует ‘a’, однако есть ‘b’ (ее не разрешали).
Здесь шаблон поиска выглядит следующим образом: буква ‘x’, далее ‘a’ может быть либо не быть, далее ‘x’.
PHP regex exact word match
In the following examples we show how to look for exact word matches.
php> echo preg_match("/mother/", "mother"); 1 php> echo preg_match("/mother/", "motherboard"); 1 php> echo preg_match("/mother/", "motherland"); 1
The pattern fits the words mother, motherboard and motherland.
Say, we want to look just for exact word matches. We will use the aforementioned
anchor and characters.
php> echo preg_match("/^mother$/", "motherland"); 0 php> echo preg_match("/^mother$/", "Who is your mother?"); 0 php> echo preg_match("/^mother$/", "mother"); 1
Using the anchor characters, we get an exact word match for a pattern.
Функции для работы с регулярными выражениями
В PHP есть поддержка 2 типов записи РВ — POSIX и Perl. POSIX (Portable Operating System Interface) представляет собой интерфейс переносной операционной системы и стандарт для интерфейсов приложений. Сейчас мы рассмотрим РВ POSIX и Perl-совместимые РВ.
Скорость выполнения функций для работы с РВ ниже строковых функций, которые обладают аналогичными возможностями. По этой причине лучше использовать строковые функции — если, конечно, ущерба эффективности не наносится.
ereg()
bool ereg(string pattern, string string )
Эта функция осуществляет поиск соответствия РВ в строке string, который задан в шаблоне pattern. В случае наличия соответствий шаблона с подвыражениями их сохранят в массиве соответствий regs. В $regs имеется копия строки string, а в $regs находится подстрока, которая начинается с первой левой скобки. Подстрока со второй левой скобки хранится в $regs и т. д.
Рассмотрим код, который из формата YYYY-MM-DD преобразовывает формат даты в DD.MM.YYYY.
<? $date = "2015-03-21"; if (ereg ("({4})-({1,2})-({1,2})", $date, $regs)){ echo "$regs.$regs.$regs"; } else{ echo "Неверный формат даты: $date"; } ?>
ereg_replace()
string ereg_replace(string pattern, string replacement, string string)
Данная функция меняет шаблон pattern, который был обнаружен в строке string, на строку replacement. При наличии соответствия происходит осуществление модифицированной строки.
Будьте внимательны: указание числа как типа, который отличен от строкового, является ошибкой — число должно всегда указываться как строка.
<? $number = "1952"; $str = "Он родился в пятьдесят втором."; echo("до замены:$str"); $str = ereg_replace("пятьдесят втором", $number, $str); echo("<br> после замены: $str"); ?>
Результат:
до замены: Он родился в пятьдесят втором.после замены: Он родился в 1952.
eregi()
bool eregi (string pattern, string string)
Данная функция аналогична ereg. Отличие состоит в том, что регистр игнорируется.
eregi_replace()
string eregi_replace (string pattern, string replacement, string string)
Отличие данной функции от ereg_replace состоит в том, что она не является чувствительной к регистру.
split()
array split (string pattern, string string )
Данная функция проводит возвращение массива строк из подстрок строк string, которые были образованы в соответствии с РВ pattern в ходе разделения строки string на подстроки. При указании параметра limit (он не является обязательным) возвращаемый массив будет иметь до limit элементов, причем в последнем имеется неразделенная часть строки.
Данная функция окажет пользу при разделении доменных имен, дат и проч. Например:
<? $url = "www.softtime.ru"; $array = split ("\.", $url); foreach($array as $index => $val) { echo("$index -> $val <br />"); }?>
В результате будет следующее:
0 -> www 1 -> softtime 2 -> ru
Это же можно осуществить и с датой:
<? $date = "10-12-2003" $array = split ("-", $date); foreach($array as $index => $val){ echo("$index -> $val <br />"); } ?>
В результате мы получим:
0 -> 10 1 -> 12 2 -> 2015
spliti()
array spliti (string pattern, string string )
Практические примеры сложных регулярных выражений
Теперь, когда вы знаете теорию и основной синтаксис регулярных выражений в PHP, пришло время создать и проанализировать некоторые более сложные примеры.
1) Проверка имени пользователя с помощью регулярного выражения
Начнем с проверки имени пользователя. Если у вас есть форма регистрации, вам понадобится проверять на правильность имена пользователей. Предположим, вы не хотите, чтобы в имени были какие-либо специальные символы, кроме «» и, конечно, имя должно содержать буквы и возможно цифры. Кроме того, вам может понадобиться контролировать длину имени пользователя, например от 4 до 20 символов.
Сначала нам нужно определить доступные символы. Это можно реализовать с помощью следующего кода:
После этого нам нужно ограничить количество символов следующим кодом:
{4,20}
Теперь собираем это регулярное выражение вместе:
^{4,20}$
В случае Perl-совместимого регулярного выражения заключите его символами ‘‘. Итоговый PHP-код выглядит так:
<?php $pattern = '/^{4,20}$/'; $username = "demo_user-123"; if (preg_match($pattern, $username)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
2) Проверка шестнадцатеричного кода цвета регулярным выражением
Шестнадцатеричный код цвета выглядит так: , также допустимо использование краткой формы, например . В обоих случаях код цвета начинается с и затем идут ровно 3 или 6 цифр или букв от a до f.
Итак, проверяем начало кода:
^#
Затем проверяем диапазон допустимых символов:
После этого проверяем допустимую длину кода (она может быть либо 3, либо 6). Полный код регулярного выражения выйдет следующим:
^#(({3}$)|({6}$))
Здесь мы используем логический оператор, чтобы сначала проверить код вида , а затем код вида . Итоговый PHP-код проверки регулярным выражением выглядит так:
<?php $pattern = '/^#(({3}$)|({6}$))/'; $color = "#1AA"; if (preg_match($pattern, $color)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
3) Проверка электронной почты клиента с использованием регулярного выражения
Теперь давайте посмотрим, как мы можем проверить адрес электронной почты с помощью регулярных выражений. Сначала внимательно рассмотрите следующие примеры адресов почты:
john.doe@test.com john@demo.ua john_123.doe@test.info
Как мы можем видеть, символ является обязательным элементом в адресе электронной почты. Помимо этого должен быть какой-то набор символов до и после этого элемента. Точнее, после него должно идти допустимое доменное имя.
Таким образом, первая часть должна быть строкой с буквами, цифрами или некоторыми специальными символами, такими как . В шаблоне мы можем написать это следующим образом:
^+
Доменное имя всегда имеет, скажем, имя и tld (top-level domain) – т.е, доменную зону. Доменная зона – это , , и тому подобное. Это означает, что шаблон регулярного выражения для домена будет выглядеть так:
+\.{2,5}$
Теперь, если мы соберем все в кучу, то получим полный шаблон регулярного выражения для проверки адреса электронной почты:
^+@+\.{2,5}$
В коде PHP эта проверка будет выглядеть следующим образом:
<?php $pattern = '/^+@+\.{2,5}$/'; $email = "john_123.doe@test.info"; if (preg_match($pattern, $email)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
Надеемся, что сегодняшняя статья помогла вам при знакомстве с регулярными выражениями в PHP, а практические примеры пригодятся вам при использовании регулярных выражений в собственных PHP скриптах.
-
3754
-
35
-
Опубликовано 16/04/2019
-
PHP, Уроки программирования
PHP regex quantifiers
A quantifier after a token or a group specifies how often that
preceding element is allowed to occur.
? - 0 or 1 match * - 0 or more + - 1 or more {n} - exactly n {n,} - n or more {,n} - n or less (??) {n,m} - range n to m
The above is a list of common quantifiers.
The question mark indicates there is zero or one of
the preceding element.
zeroorone.php
<?php $words = ; $pattern = "/colou?r/"; foreach ($words as $word) { if (preg_match($pattern, $word)) { echo "$word matches the pattern\n"; } else { echo "$word does not match the pattern\n"; } }
We have four nine in the array.
$pattern = "/colou?r/";
Color is used in American English, colour in British English.
This pattern matches both cases.
$ php zeroorone.php color matches the pattern colour matches the pattern comic does not match the pattern colourful matches the pattern colored matches the pattern cosmos does not match the pattern coloseum does not match the pattern coloured matches the pattern colourful matches the pattern
This is the output of the script.
The metacharacter matches the preceding element
zero or more times.
zeroormore.php
<?php $words = ; $pattern = "/.*even/"; foreach ($words as $word) { if (preg_match($pattern, $word)) { echo "$word matches the pattern\n"; } else { echo "$word does not match the pattern\n"; } }
In the above script, we have added the metacharacter.
The combination means, zero, one or more single characters.
$ php zeroormore.php Seven matches the pattern even matches the pattern Maven does not match the pattern Amen does not match the pattern Leven matches the pattern
Now the pattern matches three words: Seven, even and Leven.
php> print_r(preg_grep("#o{2}#", )); Array ( => gool => root => foot )
The pattern matches strings that contain exactly
two ‘o’ characters.
php> print_r(preg_grep("#^\d{2,4}$#", )); Array ( => 12 => 123 => 1234 )
We have this pattern. The is a character
set; it stands for digits. The pattern matches numbers that have 2, 3, or 4 digits.
Регулярные выражения в разных языках программирования
Здесь я приведу примеры использования регулярных выражений в различных языках программирования
Заранее говорю, я не буду заострять внимание на синтаксисе языка программирования, так как это уже не касается данной темы. C#
C#
Здесь мы создаем строку с текстом, который хотим проверить, создаем объект класса Regex и в конструктор пишем нашу регулярку (как я и говорил, я не буду заострять внимание на том, что такое объект класса и конструктор). Потом создаем объект класса MatchCollection и от объекта regex вызываем метод Matches и в параметры передаем нашу строку
В результате все сопоставления будут добавляться в коллекцию matches.
Java
Здесь похожая ситуация. Создаем объект класса Pattern и записываем нашу строку. CASE_INSENSITIVE означает, что он не привязан к регистру (то есть нет разницы между заглавными и строчными символами). Создаем объект класса Matcher и пишем туда регулярку.
JavaScript
Здесь тоже все просто. Вы создаете объект regex и пишете туда регулярку. И затем просто создаете объект matches, который будет являться коллекцией и вызываете метод exec и в параметры передаете строку.
Регулярные выражения PHP
PHP содержит встроенные функции, которые позволяют работать с регулярными выражениями. Теперь рассмотрим часто используемые функции регулярных выражений PHP.
- preg_match — используется для выполнения сопоставления с шаблоном строки. Она возвращает true, если совпадение найдено, и false, если совпадение не найдено;
- preg_split — используется для разбивки строки по шаблону, результат возвращается в виде числового массива;
- preg_replace – используется для поиска по шаблону и замены на указанную строку.
Ниже приведен синтаксис функций регулярных выражений, таких как preg_match, preg_split или PHP regexp replace:
<?php имя_функции('/шаблон/',объект); ?>
, где
«имя_функции» — это либо preg_match, либо preg_split, либо preg_replace.«/…/» — косые черты обозначают начало и конец регулярного выражения.«‘/шаблон/’» — шаблон, который нам нужно сопоставить.«объект» — строка, с которой нужно сопоставлять шаблон.
Теперь рассмотрим практические примеры использования упомянутых выше функций.
Preg match PHP
В первом примере функция preg_match используется для выполнения простого сопоставления шаблоном для слова guru в заданном URL-адресе.
В приведенном ниже коде показан вариант реализации данного примера:
<?php $my_url = "www.guru99.com"; if (preg_match("/guru/", $my_url)) { echo "the url $my_url contains guru"; } else { echo "the url $my_url does not contain guru"; } ?>
Рассмотрим ту часть кода, которая отвечает за вывод «preg_match (‘/ guru /’, $ my_url)».
Здесь:
«preg_match(…)» — функция PHP match regexp.«‘/Guru/’» — шаблон регулярного выражения.«$My_url» — переменная, содержащая текст, с которым нужно сопоставить шаблон.
Preg split PHP
Рассмотрим другой пример, в котором используется функция preg_split.
Мы возьмем фразу и разобьем ее на массив; шаблон предназначен для поиска единичного пробела:
<?php $my_text="I Love Regular Expressions"; $my_array = preg_split("/ /", $my_text); print_r($my_array ); ?>
Preg replace PHP
Рассмотрим функцию preg_replace, которая выполняет сопоставление с шаблоном и заменяет найденный результат другой строкой.
Приведенный ниже код ищет в строке слово guru. Он заменяет его кодом css, который задает цвет фона:
<?php $text = "We at Guru99 strive to make quality education affordable to the masses. Guru99.com"; $text = preg_replace("/Guru/", '<span style="background:yellow">Guru</span>', $text); echo $text; ?>
Опережающие и ретроспективные проверки — (?=) and (?
d(?=r) соответствует d, только если после этого следует r, но r не будет входить в соответствие выражения -> тест(?<=r)d соответствует d, только если перед этим есть r, но r не будет входить в соответствие выражения -> тест
Вы можете использовать оператор отрицания !
d(?!r) соответствует d, только если после этого нет r, но r не будет входить в соответствие выражения -> тест(?<!r)d соответствует d, только если перед этим нет r, но r не будет входить в соответствие выражения -> тест
Заключение
Как вы могли убедиться, области применения регулярных выражений разнообразны. Я уверен, что вы сталкивались с похожими задачами в своей работе (хотя бы с одной из них), например такими:
- Валидация данных (например, правильно ли заполнена строка time)
- Сбор данных (особенно веб-скрапинг, поиск страниц, содержащих определённый набор слов в определённом порядке)
- Обработка данных (преобразование сырых данных в нужный формат)
- Парсинг (например, достать все GET параметры из URL или текст внутри скобок)
- Замена строк (даже во время написания кода в IDE, можно, например преобразовать Java или C# класс в соответствующий JSON объект, заменить “;” на “,”, изменить размер букв, избегать объявление типа и т.д.)
- Подсветка синтаксиса, переименование файла, анализ пакетов и многие другие задачи, где нужно работать со строками (где данные не должны быть текстовыми).
Перевод статьи Jonny Fox: Regex tutorial — A quick cheatsheet by examples
Регулярные выражения в PHP
PHP имеет встроенные функции, которые позволяют нам работать с регулярными выражениямии. Давайте теперь посмотрим на часто используемые функции регулярных выражений в PHP.
— эта функция используется для сопоставления с образцом в строке. Она возвращает истину, если совпадение найдено, и ложь, если совпадение не найдено. — эта функция используется для сопоставления с образцом в строке, а затем разбивает результаты в числовой массив. — эта функция используется для сопоставления с образцом строки и затем замены совпадения указанным текстом.Ниже приведен синтаксис функции регулярного выражения, такой как , или :
<?php function_name('/pattern/',subject); ?>
«function_name (…)» это либо , , либо . «/…/» Косая черта обозначает начало и конец нашего регулярного выражения. «/ pattern /» — это шаблон, который нам нужен. «subject» — текстовая строка, с которой нужно сопоставить.
Давайте теперь посмотрим на практические примеры, которые реализуют вышеупомянутые функции регулярных выражений в PHP.
str.replace(str|regexp, str|func)
Это универсальный метод поиска-и-замены, один из самых полезных. Этакий швейцарский армейский нож для поиска и замены в строке.
Мы можем использовать его и без регулярных выражений, для поиска-и-замены подстроки:
Хотя есть подводный камень.
Когда первый аргумент является строкой, он заменяет только первое совпадение.
Вы можете видеть это в приведённом выше примере: только первый заменяется на .
Чтобы найти все дефисы, нам нужно использовать не строку , а регулярное выражение с обязательным флагом :
Второй аргумент – строка замены. Мы можем использовать специальные символы в нем:
Спецсимволы | Действие в строке замены |
---|---|
вставляет | |
вставляет всё найденное совпадение | |
вставляет часть строки до совпадения | |
вставляет часть строки после совпадения | |
если это 1-2 значное число, то вставляет содержимое n-й скобки | |
вставляет содержимое скобки с указанным именем |
Например:
Для ситуаций, которые требуют «умных» замен, вторым аргументом может быть функция.
Она будет вызываться для каждого совпадения, и её результат будет вставлен в качестве замены.
Функция вызывается с аргументами :
- – найденное совпадение,
- – содержимое скобок (см. главу Скобочные группы).
- – позиция, на которой найдено совпадение,
- – исходная строка,
- – объект с содержимым именованных скобок (см. главу Скобочные группы).
Если скобок в регулярном выражении нет, то будет только 3 аргумента: .
Например, переведём выбранные совпадения в верхний регистр:
Заменим каждое совпадение на его позицию в строке:
В примере ниже две скобки, поэтому функция замены вызывается с 5-ю аргументами: первый – всё совпадение, затем два аргумента содержимое скобок, затем (в примере не используются) индекс совпадения и исходная строка:
Если в регулярном выражении много скобочных групп, то бывает удобно использовать остаточные аргументы для обращения к ним:
Или, если мы используем именованные группы, то объект с ними всегда идёт последним, так что можно получить его так:
Использование функции даёт нам максимальные возможности по замене, потому что функция получает всю информацию о совпадении, имеет доступ к внешним переменным и может делать всё что угодно.