Экранировка спецсимволов в регулярках 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'
?>



Чат с GPT Компилятор