Utilizzare le espressioni regolari

7 ottobre 2016

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:

ParametroDescrizione
$patternPattern di ricerca.
$replacementLa stringa che verrà sostituita.
$subjectStringa da sostituire.
$limitLimite 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.

ParametroDescrizione
$patternPattern di ricerca.
$callbackFunzione di callback.
$subjectStringa da sostituire.
$limitLimite 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.

Tutte le lezioni

1 ... 26 27 28 ... 51

Se vuoi aggiornamenti su Utilizzare le espressioni regolari inserisci la tua e-mail nel box qui sotto:
Tags:
 
X
Se vuoi aggiornamenti su Utilizzare le espressioni regolari

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy