Экранировка спецсимволов в регулярках PHP
Предположим, что мы хотим сделать так, чтобы спецсимвол обозначал сам себя. Для этого его нужно экранировать с помощью обратного слеша. Давайте посмотрим на примерах.
Пример
В следующем примере автор регулярки хотел,
чтобы шаблон поиска выглядел так: буква
'a'
, затем плюс '+'
, затем
буква 'x'
. Однако, автор кода
не заэкранировал символ '+'
и поэтому
шаблон поиска самом деле он выглядит так:
буква 'a'
один или более раз, потом
буква 'x'
:
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
В результате в переменную запишется следующее:
'a+x ! ! !'
Пример
А сейчас автор заэкранировал плюс обратным
слешем. Теперь шаблон поиска выглядит так,
как надо: буква 'a'
, затем плюс
'+'
, затем буква 'x'
.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
В результате в переменную запишется следующее:
'! ax aax aaax'
Пример
В данном примере шаблон выглядит так: буква
'a'
, затем точка '.'
, затем
буква 'x'
:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
В результате в переменную запишется следующее:
'! abx azx'
Пример
А следующем примере автор забыл заэкранировать слеш и под регулярку попали все подстроки, так как незаэкранированная точка обозначает любой символ:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
В результате в переменную запишется следующее:
'! ! !'
Пример
Обратите внимание на то, что если вы забудете обратный слеш для точки (когда она должна обозначать сама себя) - этого можно даже не заметить:
<?php
preg_replace('#a.x#', '!', 'a.x'); // вернет '!', как мы и хотели
?>
Визуально работает правильно (так как точка
обозначает любой символ, в том числе и обычную
точку '.'
). Но если поменять строку,
в которой происходят замены - мы увидим нашу
ошибку:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // вернет '! ! !', а ожидалось '! abx azx'
?>