Функции 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_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
|
Глобальный поиск, поиск и замена продолжатся даже после первого удачного совпадения |
i
|
Регистронезависимый поиск |
x
|
Регулярка перестанет учитывать пробелы |
m
|
Многострочный режим |
s
|
Однострочный режим |
U
|
Нежадный поиск, все операторы повторений станут нежадными, а '?', наоборот, будет добавлять им жадности |
u
|
Корректная работа с utf-8, ставьте его, чтобы не было проблем с кириллицей |
X
|
Экранировка обычного символа приведет к ошибке. Без него - обычные символы можно экранировать, они все равно будут обозначать сами себя (исключение: цифры, они станут карманами). |