Nella precedente lezione abbiamo visto cos'è un'espressione regolare e come verificare che una stringa sia determinata o meno da una regex. Analizziamo ora le altre funzioni che abbiamo a disposizione in PHP per sfruttare le potenzialità delle espressioni regolari.
preg_match
Abbiamo visto la funzione preg_match
nella scorsa lezione. Prima di procedere con le nuove funzioni, analizziamo un dettaglio appena accennato la scorsa volta: la possibilità di salvare i risultati della ricerca in un array. Prendiamo come esempio la seguente espressione regolare:
/^(\d*)-(\d*)$/
La regex è vera se la stringa è formata da due serie di numeri separati da un carattere -
. E' una versione molto semplificata di un'espressione regolare utilizzata per determinare un numero di telefono italiano valido. Stringhe come le seguenti sono quindi valide:
340-12345678
02-12312322
0775-1231233
Supponiamo che dato un numero di telefono si abbia l'esigenza di separare il prefisso dal numero. Possiamo usare la funzione in questo modo:
$pattern = "/^(\d*)-(\d*)$/";
preg_match($pattern, '340-8652066', $result);
$prefisso = $result[1];
$numero = $result[2];
Come possiamo vedere abbiamo usato un terzo parametro chiamato $result
per recuperare le informazioni relative al prefisso ed al numero. Questo perché il terzo parametro conterrà i risultati della ricerca. In particolare $result[0]
contiene tutta la stringa che corrisponde al pattern utilizzato, a seguire andranno tutti i criteri contenuti nel pattern: nel nostro caso il primo ed il secondo (\d*)
.
preg_match_all
La funzione preg_match_all
è un'estensione della precedente con la differenza che restituisce tutte le occorrenze che corrispondono al pattern utilizzato. Supponiamo di avere una stringa che contiene diversi numeri di telefono che vogliamo salvare in un array:
$stringa = 'Ufficio: 0452-222222 Cellulare: 300-0000000 Casa: 0775-12312123';
$pattern = '/(\d*)-(\d*)/';
preg_match_all($pattern, $stringa, $result);
$numeri = $result[0];
var_dump($numeri);
Il var_dump
ci restituirà qualcosa di simile a:
array(3) {
[0]=>
string(11) "0452-222222"
[1]=>
string(11) "300-0000000"
[2]=>
string(10) "0775-12312123"
}
Ovviamente se provassimo a stampare $result[1]
o $result[2]
conterranno altri array con il match dei singoli criteri.
preg_replace
Un'altra funzione molto utile è la funzione preg_replace
con la quale possiamo sostituire le occorrenze di un'espressione regolare con un'altra stringa. La funzione prende in ingresso quattro parametri:
Parametro | Descrizione |
---|---|
$pattern |
Pattern di ricerca. |
$replacement |
La stringa che verrà sostituita. |
$subject |
Stringa da sostituire. |
$limit |
Limite delle sostituzioni da effettuare (opzionale). |
Data la stringa con i numeri di telefono che abbiamo visto nell'esempio precedente, supponiamo di voler nascondere i numeri di telefono sostituendoli con degli asterischi:
$stringa = 'Ufficio: 0452-222222 Cellulare: 300-0000000 Casa: 0775-12312123';
$pattern = '/(\d*)-(\d*)/';
$stringa = preg_replace($pattern, '******', $stringa);
echo $stringa;
//Stamperà:
//Ufficio: ****** Cellulare: ****** Casa: ******
preg_replace_callback
La funzione preg_replace_callback
si occupa anch'essa di effettuare delle sostituzioni con la differenza che prende in ingresso una funzione di callback per effettuarle.
Parametro | Descrizione |
---|---|
$pattern |
Pattern di ricerca. |
$callback |
Funzione di callback. |
$subject |
Stringa da sostituire. |
$limit |
Limite delle sostituzioni da effettuare (opzionale). |
La funzione di callback prenderà in ingresso un array $matches
che contiene i risultati di ricerca come nella preg_match
vista in precedenza. Supponiamo di voler trasformare una URL di YouTube nel suo codice di embed per mostrarlo all'interno di una pagina. Nel nostro caso la funzione preg_replace_callback
ci viene in soccorso trasformando l'indirizzo:
$youtubeUrl = 'https://www.youtube.com/watch?v=1cQh1ccqu8M';
$youtubePattern = "/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i";
function youtubeEmbedCallback($matches) {
if (!isset($matches[2])) {
return '';
}
$videoId = $matches[2];
return '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $videoId . '" frameborder="0" allowfullscreen></iframe>';
}
$youtubeEmbed = preg_replace_callback($youtubePattern, "youtubeEmbedCallback", $youtubeUrl);
echo $youtubeEmbed;
//Stamperà:
//<iframe width="560" height="315" src="https://www.youtube.com/embed/1cQh1ccqu8M" frameborder="0" allowfullscreen></iframe>
Nel codice che abbiamo appena visto abbiamo utilizzato la funzione youtubeEmbedCallback
per effettuare le sostituzioni. Al suo interno troviamo un'espressione regolare un po' complessa che ci consente di recuperare tutte le differenti tipologie di link di YouTube. Data l'espressione regolare, attraverso preg_replace_callback
sostituiamo il link di YouTube con un codice HTML che possiamo inserire all'interno delle nostre pagine Web.