Redazione
a- a+

Espressioni regolari in PHP: preg_match (), preg_replace() e preg_match_all()

Vediamo come si usano ed a cosa servono le espressioni regolari preg_match (), preg_replace() e preg_match_all().

Le espressioni regolari sono dei particolari costrutti sintattici che vengono utilizzati per le operazioni di pattern matching, cioè servono per rilevare la presenza di una sotto-stringa all’interno di una sequenza di caratteri principale. Per fare un semplice esempio, un’operazione di pattern matching sulla sequenza di caratteri.

È molto comodo avere questi costrutti sintattici che ci permettono di creare dei potenti strumenti di confronto e verifica scrivendo pochissime righe di codice. Basti pensare a dovere implementare il controllo se una email è valida o meno, o il controllo per verificare l’esattezza del codice fiscale. Questi controlli possono essere implementati usando le espressioni regolari con una semplice stringa. Ma abbiamo ancora bisogno di sapere come applicare nel contesto del PHP a fare effettivamente qualcosa di produttivo, quindi diamo un’occhiata alle funzioni: 

preg_match (), preg_replace() e preg_match_all().

La funzione preg_match() esegue un riconoscimento nel parametro stringa utilizzando l’espressione regolare passata come criterio. Un caso molto noto dell’utilizzo di questa funzione è quello della validazione di un’email:

<?phpif (preg_match(‘/^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z]{2,4}$/’,    $_POST["emailAddy"])) {    echo "Email accettata";}else {    echo "Email errata.";}?>

Se viene trovata una corrispondenza, preg_match() restituisce 1, altrimenti 0. Si noti che abbiamo aggiunto una barra (/) all’inizio e alla fine della regex (espressione regolare). Queste vengono utilizzate come delimitatori per mostrare la funzione in cui l’espressione regolare inizia e finisce. 

preg_replace() ricerca in una stringa tramite i criteri stabiliti dall’espressione regolare e nel momento che individua la determinata sotto-stringa, essa viene sostituita da un altra. È possibile specificare un limite alle sostituzioni consentite, in assenza di un limite o, per un limite uguale a "-1", saranno effettuate tutte le sostituzioni possibili.

Esempio.

Vogliamo ricercare all’interno di un testo l’email e formattarla con caratteri in grassetto:

<?php$formattedBlock = preg_replace(    ‘/([A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z]{2,4})/U’,    "<b>\1</b>", $blockOText);?>

Il secondo argomento passato alla funzione preg_replace()

Errore. Riferimento a collegamento ipertestuale non valido.

sta dicendo alla funzione di sostituire il testo con un tag di apertura in grassetto, qualunque sia la corrispondenza tra il modello della prima serie di parentesi e un tag di chiusura in grassetto. Se ci fossero altri insiemi di parentesi, potrebbero essere indicati con 2, 3 e così via a seconda della loro posizione.

Infine, la funzione preg_match_all() effettua una ricerca di tutte le regex passate come parametro all’interno della stringa; gli elementi riconosciuti vengono posti all’interno di una matrice.

<?php$matchesFound = preg_match_all(    ‘/([a-z0-9-_.+%]+@[a-z0-9-.]+.[a-z]{2,4})/Ui’,    $articleWithEmailAddys, $listOfEmails);if ($matchesFound) {    foreach ($listOfEmails[0] as $foundEmail) {  echo $foundEmail . "<br/>";    }}?>

preg_match_all() restituisce quante corrispondenze ha trovato, in riferimento alla variabile fornita come terzo argomento. Si crea di fatto un array multi-dimensionale in cui si trovano le partite che stiamo cercando. In aggiunta al modificatore U, che indica al motore regex che vogliamo che il modello da applicare sia di tipo case-insensitive viene aggiunta una i. Ciò indica che una lettera può essere sia maiuscola che minuscola. Questo ci permette di scrivere cose come [a-z0-9] nella nostra espressione invece di [A-Za-z0-9] che rende  la regex più corta e più facile da leggere.