Escaping dei caratteri speciali nelle espressioni regolari di PHP

Supponiamo di voler fare in modo che un carattere speciale rappresenti se stesso. Per fare ciò è necessario escaparlo utilizzando il backslash . Vediamo alcuni esempi.

Esempio

Nell'esempio seguente, l'autore dell'espressione regolare voleva che il modello di ricerca fosse così: la lettera 'a', poi il più '+', poi la lettera 'x'. Tuttavia, l'autore del codice non ha escapato il carattere '+' e quindi il modello di ricerca in realtà è così: la lettera 'a' una o più volte, poi la lettera 'x':

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a+x#', '!', $str);
?>

Di conseguenza, nella variabile verrà memorizzato quanto segue:

php'a+x ! ! !'

Esempio

Ora l'autore ha escapato il più con un backslash . Ora il modello di ricerca è come dovrebbe essere: la lettera 'a', poi il più '+', poi la lettera 'x'.

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a\+x#', '!', $str);
?>

Di conseguenza, nella variabile verrà memorizzato quanto segue:

php'! ax aax aaax'

Esempio

In questo esempio, il modello è così: la lettera 'a', poi il punto '.', poi la lettera 'x':

php<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a\.x#', '!', $str);
?>

Di conseguenza, nella variabile verrà memorizzato quanto segue:

php'! abx azx'

Esempio

Nell'esempio seguente, l'autore si è dimenticato di escapare il punto e l'espressione regolare ha catturato tutte le sottostringhe, poiché il punto non escapato rappresenta qualsiasi carattere:

php<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a.x#', '!', $str);
?>

Di conseguenza, nella variabile verrà memorizzato quanto segue:

php'! ! !'

Esempio

Si noti che se ci si dimentica il backslash per il punto (quando dovrebbe rappresentare se stesso) - potrebbe passare addirittura inosservato:

php<?php
  preg_replace('#a.x#', '!', 'a.x'); // restituirà '!', come volevamo
?>

Visivamente funziona correttamente (poiché il punto rappresenta qualsiasi carattere, incluso un punto normale '.'). Ma se si cambia la stringa in cui avvengono le sostituzioni - vedremo il nostro errore:

php<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // restituirà '! ! !', ma ci si aspettava '! abx azx'
?>