⊗ppPmRgESCh 226 of 447 menu

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' ?>
deuzleskafr