Функции PHP
preg_replace()
Выполняет поиск и замену по регулярному выражению, поиск ведется до конца строки.
<?php
preg_replace(#шаблон_для_поиска#, на_что_менять, где_искать);
?>
<?php
echo preg_replace('#a#', '!', 'bab xax'); // вернет b!b x!x
?>
preg_replace карман
Если мы что-то положим в карман в регулярке, то в параметре на что менять
мы можем обратиться к этому карману так:
$1
первый карман$2
второй карман$0
соответствует всему выражению
<?php
preg_replace(#шаблон_для_поиска_с_карманом#, на_что_менять, где_искать);
?>
<?php
echo preg_replace('#([a-z]+)@([a-z]+)#', '$2@$1', 'a@b aa@bb'); // вернет b@a bb@aa
?>
Если мы что-то положим в карман в регулярке, то в параметре на что менять
мы можем обратиться к этому карману так: $1
– первый карман, $2
второй карман и так далее.
Давайте решим следующую задачу: даны строки вида aaa@bbb
- буквы, потом собака, потом буквы. Нужно поменять местами буквы до @
и после. В нашем случае из aaa@bbb
сделать bbb@aaa
:
<?php
echo preg_replace('#([a-z]+)@([a-z]+)#', '$2@$1', 'a@b aa@bb'); // b@a bb@aa
?>
Карман $0
соответствует всему выражению. Давайте заменим подстроки из букв на них самих с !
по краям:
<?php
echo preg_replace('#[a-z]+#', '!$0!', 'aaa bbb'); // вернет '!aaa! !bbb!'
?>
preg_replace_callback()
Функциия preg_replace_callback
, работает аналогично функции preg_replace
находит и заменяет по регулярному выражению, но позволяет выполнять дополнительные манипуляции с найденными кусочками.
Первым параметром функция принимает регулярку, вторым функцию-коллбэк которая будет вызвана для каждого найденного совпадения, третьим строку в которой осуществляется замена.
<?php
preg_replace(#шаблон_для_поиска#, функция_коллбэк, где_искать);
?>
У нас есть строка, нам нужно найти все конструкции вида число+число=
и сделать так, чтобы после равно появился результат сложения:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Первым параметром коллбэка нужно указать переменную, в которую будет попадать найденное. Эта переменная будет представлять собой массив карманов найденного. Напишем, код, который поймает наши подстроки, при этом положив первое число в первый карман, а второе во второй:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function ($match) {
var_dump($match);
}, $str);
?>
В результате наш var_dump
сработает три раза, по очереди выведя следующее:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Каждое совпадение будет заменено на то, что возвращает коллбэк через return
. Заменим каждую подстроку на сумму пары чисел в ней:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function ($match) {
return $match[0] . ($match[1] + $match[2]);
}, $str);
// выведет '2+3=5 3+5=8 7+8=13'
echo $res;
?>
preg_match()
Проверяет, есть ли в строке совпадение с регуляркой, функция найдет только первое совпадение и закончит свою работу. Функция возвращает:
1
значит есть что искали, сколько раз неясно0
нет того что искалиfalse
в случае какой-либо ошибки
<?php
preg_match(#шаблон_для_поиска#, где_искать);
?>
<?php
echo preg_match('#a+#', 'eee aaa bbb'); // вернет 1
?>
<?php
echo preg_match('#a+#', 'eee aaa aa bbb'); // все равно вернет 1
?>
<?php
echo preg_match('#a+#', 'eee bbb'); // вернет 0
?>
preg_match_all()
Функция находит все совпадения и возвращает массив с найденным.
<?php
preg_match_all(#шаблон_для_поиска#, где_искать, найденное);
?>
<?php
echo preg_match_all('#a+#', 'eee aaa bbb'); // вернет 1
?>
<?php
echo preg_match_all('#a+#', 'eee aaa aa bbb'); // вернет 2
?>
<?php
echo preg_match_all('#a+#', 'eee bbb'); // вернет 0
?>
preg_match_all третий параметр
<?php
echo preg_match_all('#a+#', 'eee aaa aa bbb a', $matches)); // вернет 3
// выведет массив совпадений:
var_dump($matches);
[0=>[0=>'aaa', 1=>'aa', 2=>'a']]
?>
preg_match_all карман
<?php
echo preg_match_all('#x(a+)x#', 'xax xaax xaaax', $matches); //выведет 3
// выведет массив совпадений и содержимое кармана:
var_dump($matches);
[
0=>[0=>'xax', 1=>'xaax', 2=>'xaaax'], // это найденные подстроки
1=>[0=>'a', 1=>'aa', 2=>'aaa'] // это содержимое кармана
]
?>
preg_split()
Делит строку регулярным выражением, возвращает массив, содержащий подстроки из строки, разделённой по границам совпадений.
<?php
preg_split ('#шаблон_для_поиска#', 'где_искать', 'limit', 'flags');
?>
#шаблон_для_поиска#
шаблон для поиска в виде строки с регулярным выражениемгде_искать
входная строкаlimit
если указан, функция возвращает не более, чем limit подстрок, оставшаяся часть строки будет возвращена в последней подстроке. Специальное значение limit, равное -1, 0 или NULL подразумевает отсутствие ограничения, и, в качестве фактического стандарта в PHP, можно использовать NULL для пропуска параметра flags-
flags
может быть любой комбинацией следующих флагов (объединенных с помощью побитового оператора |):PREG_SPLIT_NO_EMPTY
если указан этот флаг, функция preg_split() вернет только непустые подстрокиPREG_SPLIT_DELIM_CAPTURE
если указан этот флаг, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функциейPREG_SPLIT_OFFSET_CAPTURE
Если указан этот флаг, для каждой найденной подстроки будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемого массива: каждый элемент будет содержать массив, содержащий в индексе с номером 0 найденную подстроку, а смещение этой подстроки в параметрегде искать
- в индексе 1
<?php
// разбиваем строку по произвольному числу запятых и пробельных символов
$keywords = preg_split("#[\s,]+#", "hypertext language, programming");
print_r($keywords); // вернет массив: Array ( [0] => hypertext [1] => language [2] => programming )
?>
<?php
// разбиваем строку на составляющие символы
$keywords = preg_split('##', 'string', -1, PREG_SPLIT_NO_EMPTY);
print_r($keywords); // вернет массив: Array ( [0] => s [1] => t [2] => r [3] => i [4] => n [5] => g )
?>
<?php
// разбиваем строку с указанием смещения для каждой из найденных подстрок
$keywords = preg_split('# #', 'hypertext language programming', -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($keywords); // вернет массив: Array ( [0] => Array ( [0] => hypertext [1] => 0 ) [1] => Array ( [0] => language [1] => 10 ) [2] => Array ( [0] => programming [1] => 19 ) )
?>
Модификаторы регулярных выражений
Модификаторы - это команды, которые записываются после второго ограничителя (#.+#iu
– iu
выступают модификаторами). Они позволяют изменять свойства регулярных выражений.
<?php
// в этом случае решетки в качестве ограничителей использовать нельзя, поэтому здесь стоят амперсанды модификатор x - регулярка перестанет учитывать пробелы и можно будет ставить комментарии после решетки #
echo preg_replace('&
.+? #любой символ один или более раз
a #потом буква a
&x', '!', 'строка');
?>
Модификаторы методов | ||
---|---|---|
g
|
Ищет все совпадения со «строкой-шаблоном» (по умолчанию поиск останавливается после первого совпадения) | |
u
|
Поддержка юникода, регулярка будет обрабатывать в кодировке UTF-8 | |
x
|
Все неэкранированные пробельные символы, которые находятся вне символьного класса, будут проигнорированы | |
i
|
Регистронезависимый поиск (a и A считаются эквивалентными) |
|
m
|
Многостроковый режим. По умолчанию PCRE ищет совпадения с шаблоном только внутри одной строки, а символы ^ и $ совпадают только с началом и концом всего текста. Когда этот параметр установлен, ^ и $ совпадают с началом и концом отдельных строк |
|
s
|
Однострочность, контент считается одной строкой в отличие от режима по умолчанию, символ . включает в себя пробельные символы начинает совпадать с переносом строки, хотя по умолчанию нет |
|
U
|
Инвертирует "жадность" для каждого квантификатора (если же после квантификатора стоит
? , этот квантификатор перестает быть "жадным").
|
|
X
|
Экранировка обычного символа приведет к ошибке, без X обычные символы можно экранировать, они все равно будут обозначать сами себя (исключение: цифры, они станут карманами) |