© Marco Olivo <me@olivo.net>, luglio 2001

REGULAR EXPRESSIONs (REGEXPs)

Le regular expressions (in italiano: espressioni regolari) sono un utilissimo strumento per tutti coloro che si trovano a manipolare del testo "più o meno" formattato proveniente da certe sorgenti.
Facciamo un esempio: un file HTML è un tipico esempio di testo formattato in quanto i files scritti in questo linguaggio devono essere sintatticamente corretti (in realtà questo non è verissimo per l'HTML, ma assumeremo per semplicità che sia così)
Supponiamo di avere una lista di URLs che dobbiamo leggere e dalle quali dobbiamo estrapolare, ad esempio, tutti i tags <TITLE> (uno per file)
Come fare? La prima parte è semplice: sarà sufficiente ciclare sulla lista (magari contenuta in un array, oppure richiesta ad un database) e aprire una connessione tramite la funzione fopen() verso la pagina desiderata e quindi leggere il testo con la funzione fgets() salvando tutto in un file.
Difficoltà maggiori si avranno nell'estrapolare invece i tags richiesti, in quanto la loro posizione non è nota a priori ed inoltre possono essere presenti in varia forma (ci possono essere degli "a capo", oppure degli spazi, etc.)
Come fare allora? Semplice, tramite le regexp!
Le regexp hanno infatti la capacità di adattarsi perfettamente al testo e permettono di specificare precisi patterns di ricerca (anche condizionali, cioè basati sul quello che si è già letto)
Il PHP supporta due tipi differenti di regexp: quelle "native" del linguaggio (che andremo a vedere: POSIX extended regular expressions) e quelle "Perl-like", più flessibili ma anche più complicate.
Tra le funzioni per manipolare le regexp ne segnaliamo due: eregi() ed eregi_replace() che rispettivamente cercano un testo (case insensitive) e che cercano e sostituiscono un testo (sempre case insensitive)
Come in tutte le regexp anche in quelle del PHP ci sono dei metacaratteri che significano qualcosa per l'interprete. Tra di essi citiamo:
$ indica la fine della stringa
^ indica l'inizio della stringa, a meno che non sia inserita in [] (in questo caso indica la negazione dei caratteri
  ivi presenti)
| indica una possibile scelta (OR)
[] racchiude una sequenza di caratteri
Es.
<?PHP
ereg("abc", $stringa);	/* ritorna "vero" se la stringa abc è presente in $stringa */
ereg("^abc", $stringa);	/* ritorna "vero" se la stringa abc è presente all'inizio di $stringa */
ereg("abc$", $stringa);	/* ritorna "vero" se la stringa abc è presente alla fine di $stringa */
eregi("(ozilla.[23]|MSIE.3)", getenv("HTTP_USER_AGENT"));
/* ritorna "vero" se il browser e' Netscape 2 o 3 oppure Internet Explorer 3 */
?>
Nel caso si voglia invece cercare del testo per modificarlo allora sarà necessario utilizzare l'altra funzione vista, che ha una sintassi molto intuitiva come si vede da questi esempi:
<?PHP
$string = ereg_replace("^", "<BR>", $stringa);
/* inserisce un <BR> all'inizio di $stringa */
 $string = ereg_replace("$", "<BR>", $string);
/* inserisce un <BR> alla fine di $stringa */
$string = ereg_replace("\n", "", $string);
/* sostituisce tutte le occorrenze del carattere \n con un carattere nullo (cioe' li elimina) */
?>