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