Espressioni regolari PHP con PCRE

Vota questo articolo:
1 / 52 / 53 / 54 / 55 / 5
(Nessun voto presente, vuoi essere il primo?)
Loading ... Loading ...

Aggiornamento – leggermente tardivo – sulle regex in PHP di cui abbiamo avuto modo di discutere in più occasioni su questo sito.
Con il rilascio della PHP 5.3 le funzioni ereg per le espressioni regolari POSIX sono state dichiarate deprecate, e pare che verranno rimosse nella release successiva del linguaggio (6.x). E’ vero che fin quando gli hosting utilizzeranno definitivamente tale versione passerà un bel po’ di tempo, per una questione legata alla sicurezza dell’ambiente, ma è certamente un bene conoscerle.

PCRE (Perl-Compatible Regular Expressions) si presenta come standard per le espressioni  regolari alternativo all’utilizzo delle storiche POSIX, ed in questo post daremo un sguardo generale a questa particolare sintassi, utile spesso in ambito di sviluppo WEB per sostituire URL, mostrare porzioni di testo ecc.

La libreria PCRE è in sostanza un set di funzioni che implementa le espressioni regolari con sintassi simile a quella del Perl. Come nel caso delle POSIX non è richiesta l’installazione di alcun modulo aggiuntivo PHP, dunque potete testare direttamente gli esempi che vi proporro’ qui senza eccessivi intoppi (si spera). La cosa difficile, come al solito per le regex, è quella di capire perfettamente il loro significato prima di cimentarsi nel loro utilizzo.

Eccovi anzitutto la corrispondenza di tutte le vecchie funzioni  PHP deprecate (prima colonna) e le sostitutive (seconda):

POSIX – PCRE  
ereg_replace() preg_replace() 
ereg() preg_match()  
eregi_replace() preg_replace()
eregi() preg_match() 
split() preg_split() 
spliti() preg_split() 
sql_regcase() nessuna corrisp.

Come al solito lo slash / anteposto ad un carattere indica la sua interpretazione letterale I pattern delle PCRE devono essere racchiusi all’interno di una coppia di / (ma non è, come vedremo, l’unica scelta possibile).


Un esempio funzionante di codice che lavora con PCRE in PHP è il seguente.


<ul>
<?php
$pattern = ‘/ring/’;
$stringa = ‘stringa’;

$pattern1 = ‘/Ring/’;
$stringa1 = ‘stringa’;
$stringa2 = ‘stRinga’;

echo “<li>preg_match case sensitive = “.preg_match($pattern, $stringa).”</li>”; //1, true
echo “<li>preg_match case insentive = “.preg_match($pattern1, $stringa1).”</li>”; //0, false
echo “<li>preg_match case insentive = “.preg_match($pattern1, $stringa2).”</li>”; //1, true
?>
</ul>

Inoltre:

  • /<\/\w+>/ : codifica pattern tipo </[a-z]*> (ad es. </>, </abc>, </ashgdjhsag/> ecc.)
  • |(\d{3})-\d+|Sm : codifica espressioni di un numero di almeno tre cifre oppure un carattere diverso dallo spazio (S) ed una ‘m’. Ad esempio 1234 oppure #m
  • /^(?i)php[34]/ : codifica pattern tipo ^(?i)php3 oppure ^(?i)php4 dove ^(?i) indica carattere diverso da lettera_qualsiasi (?) seguita da i
  • {^\s+(\s+)?$} : sequenza di caratteri diversi dallo spazio seguita da almeno una sequenza di caratteri spazio
Per concludere vi ripropongo la tabella con tutte le corrispondenze del caso tratta da Wikipedia:
POSIX Perl ASCII Description
[:alnum:] [A-Za-z0-9] caratteri alfanumerici
[:word:] \w [A-Za-z0-9_] caratteri alfanumerici incluso l’underscore “_” (=word)
\W [^\w] carattere non-word
[:alpha:] [A-Za-z] carattere alfabetico
[:blank:] [ \t] spazio e tab
[:cntrl:] [\x00-\x1F\x7F] caratteri di controllo
[:digit:] \d [0-9] cifre
\D [^\d] non-cifre
[:graph:] [\x21-\x7E] caratteri visibili
[:lower:] [a-z] caratteri minuscoli
[:print:] [\x20-\x7E] caratteri visibili e spazi
[:punct:] [-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~] caratteri di punteggiatura
[:space:] \s [ \t\r\n\v\f] caratteri di spaziatura del testo
\S [^\s] caratteri diversi da quelli di spaziatura del testo
[:upper:] [A-Z] lettere maiuscole
[:xdigit:] [A-Fa-f0-9] cifre esadecimali
Continua la lettura: delimitatori e meta-caratteri.

 –

MENU Fotolia