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