Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
Questo sito non lascia nessun cookie sul vostro pc, consuma pochissimi kb, non profila nulla e non raccoglie dati personali. Siete i benvenuti.

Php : Le espressioni regolari con Php - 1. parte

Con questo articolo inizia una serie di tutorial dedicati alle espressioni regolari, nome abbreviato comunemente con la sigla "regexp". Si tratta di una sequenza di caratteri che, data "in pasto" ad un apposito motore, consente di estrarre delle stringhe da un testo.

Php

Con questo articolo inizia una serie di tutorial dedicati alle espressioni regolari, nome abbreviato comunemente con la sigla "regexp". Si tratta di una sequenza di caratteri che, data "in pasto" ad un apposito motore, consente di estrarre delle stringhe da un testo. E' una tecnica molto più evoluta delle semplici funzioni stringa dei vari linguaggi di programmazione ma non si tratta di una novità: le prime espressioni regolari videro la luce alla fine degli anni 60, quando Ken Thompson le implementò nell'editor QED.
Alla base del funzionamento delle espressioni regolari esistono concetti evoluti e affascinanti come il modello degli automi a stati finiti (ASF), che esula però dal contenuto dei nostri tutorial, orientati alla pratica. Iniziamo piuttosto a vedere come Php implementa le regexp.
Fino a qualche tempo fa, Php supportava due tipologie di espressioni regolari, quelle in stile Posix e quelle in stile Perl; ciascuna di queste classi aveva delle apposite funzioni e la differenza sembrava più che altro di natura sintattica. Dalla versione 5.3 il team di sviluppo di Php ha però deprecato l'utilizzo delle funzioni di tipo Posix, ritenute meno performanti, che vengono abbandonate definitivamente nella versione 6. Per cui ci occuperemo solo di espressioni regolari in stile Perl e non delle funzioni Posix (ereg, eregi(), eregi_replace ecc.).
Iniziamo con la nostra prima espressione regolare, ipotizzando di voler estrarre da un testo tutte le parole lunghe 3 caratteri. Partiamo dal solito testo di prova e proviamo una prima soluzione con le funzioni base di php, esplodendo la stringa in un array di parole con explode() e verificando la lunghezza di ciascun elemento con strlen:
<?php
    $testo = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumyeirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diamvoluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.';
    $elenco_parole = explode(' ',$testo);
    foreach($elenco_parole as $parola){
        if(strlen($parola)==3){
            echo $parola.'<br />';
        }
    }
?>

Il codice funziona, ma è una soluzione artigianale. Vediamo come le espressioni regolari risolvono il problema:
<?php
    preg_match_all('#\b\w{3}\b#',$testo,$elenco_parole);
    print_r($elenco_parole);
?>

Tutto ruota attorno a questa apparentemente criptica espressione:
#\b\w{3}\b#
che andiamo ad analizzare adesso, carattere per carattere.
# questo carattere è in realtà arbitrario, serve a Php per capire dove inizia e dove finisce l'espressione regolare. Potete scegliere il carattere che volete (purchè non sia un numero, una lettera o un backslash), molti utilizzano lo slash("/"), personalmente preferisco "#" perché lo slash è a sua volta un carattere molto frequente nelle regexp e cosi evito di far confusione... tutto qui.
\b questi due caratteri vanno in realtà considerati insieme. Il backslash infatti fà capire al motore delle regexp che sta per arrivare un carattere speciale, che non va interpretato come letterale ma piuttosto come un comando. "\b" non cerca la stringa "slash seguito da una lettera b" ma ha un significato ben preciso. Esistono diversi caratteri speciali, li vedremo man mano, questo in particolare è il delimitatore di parola chiamato ancoraggio. "\b" Fà capire al motore di cercare una stringa che inizia (altrimenti anche la sequenza "ore" dentro "Lorem" sarebbe un insieme di 3 caratteri, a noi interessano invece solo le parole).
\w altro carattere speciale. Se \b è un delimitatore di parola, \w è una classe di caratteri, in particolare un delimitatore di lettere. Con \w diamo istruzione al motore di cercare tutto ciò che è un carattere alfanumeri, escludendo quindi i numeri, le punteggiature o caratteri simbolici.
{3} la parentesi graffa è un altro carattere speciale, detto quantificatore. In questo caso avverte il motore che sta per essere specificata la quantità di caratteri da trovare con quanto definito in precedenza. In altre parole abbiamo detto all'espressione "trova una parola (\w) che inizia (\b) e che è lunga 3 caratteri {3}"
\b l'ultimo \b è come il primo, è sempre un delimitatore, in questo caso di fine parola. Senza quest'ultimo \b anche le prime tre lettere di "Lorem" soddisferebbero la nostra espressione, perché mancando il delimitatore di parola finale il motore cercherebbe tutto ciò che è di almeno 3 lettere, fino al successivo \b di inizio parola che avevamo scritto all'inizio. Grazie a questo \b siamo sicuri che verranno considerate solo le parole intere, iniziate e finite, di 3 lettere.
La funzione preg_match_all() di php riceve tre parametri: l'espressione regolare appena illustrata, la stringa sulla quale va applicata e infine un array nel quale memorizzare il risultato (qui c'è una leggera differenza su quanto ci si aspetterebbe, ovvero un $risultato = preg_match_all($espressione,$stringa)... ma funziona cosi).
Grazie a questa espressione regolare abbiamo ottenuto con una sola riga di codice quanto prima era necessario con almeno 3 istruzioni (esplosione della stringa, ciclo sull'array e confronto con strlen().
Le potenzialità delle espressioni regolari sono ben maggiori e le vedremo nel seguito di questo tutorial.