Escaparea caracterelor speciale în expresiile regulate PHP
Să presupunem că vrem ca un caracter special să reprezinte el însuși. Pentru aceasta acesta trebuie escapat folosind backslash-ul. Să vedem câteva exemple.
Exemplul
În următorul exemplu, autorul expresiei regulate a vrut
ca șablonul de căutare să arate astfel: litera
'a', apoi plus '+', apoi
litera 'x'. Cu toate acestea, autorul codului
nu a escapat simbolul '+' și de aceea
șablonul de căutare, în realitate, arată astfel:
litera 'a' de una sau mai multe ori, apoi
litera 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Ca rezultat, în variabilă se va scrie următorul text:
'a+x ! ! !'
Exemplul
Acum autorul a escapat plusul cu backslash.
Acum șablonul de căutare arată așa
cum trebuie: litera 'a', apoi plus
'+', apoi litera 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Ca rezultat, în variabilă se va scrie următorul text:
'! ax aax aaax'
Exemplul
În acest exemplu, șablonul arată astfel: litera
'a', apoi punctul '.', apoi
litera 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Ca rezultat, în variabilă se va scrie următorul text:
'! abx azx'
Exemplul
În următorul exemplu, autorul a uitat să escape slash-ul și sub expresia regulată au căutat toate subșirurile, deoarece punctul neescapat reprezintă orice caracter:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Ca rezultat, în variabilă se va scrie următorul text:
'! ! !'
Exemplul
Atenție la faptul că dacă uitați backslash-ul pentru punct (când acesta ar trebui să reprezinte el însuși) - acest lucru s-ar putea să nu fie observat:
<?php
preg_replace('#a.x#', '!', 'a.x'); // va returna '!', așa cum ne-am dorit
?>
Vizual, funcționează corect (deoarece punctul
reprezintă orice caracter, inclusiv un punct obișnuit
'.'). Dar dacă schimbăm șirul,
în care se fac înlocuirile - ne vom vedea
eroarea:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // va returna '! ! !', dar se aștepta '! abx azx'
?>