Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

PHP abbandona le funzioni ereg: le alternative

Le diffuse funzioni ereg utilizzate in PHP 4 e in alcune versioni di PHP 5 vengono abbandonate in PHP 5.3. Ecco le alternative possibili
Le diffuse funzioni ereg utilizzate in PHP 4 e in alcune versioni di PHP 5 vengono abbandonate in PHP 5.3. Ecco le alternative possibili
Link copiato negli appunti

Le funzioni ereg sono state utilizzate per lungo tempo in applicazioni PHP per procedure di riconoscimento di espressioni regolari, esse infatti potevano risultare particolarmente utili per operazioni di ricerca ("ereg()" o "eregi()", sostituzione ("ereg_replace()" o "eregi_replace()") e suddivisione ("split()") in variabili stringa o semplici testi, aventi caratteristiche corrispondenti con quelle indicate da un'espressione regolare passata come argomento.

Non semplicissime da utilizzare, come tutte le funzioni basate sulle espressioni regolari, si erano comunque diffuse presso gli sviluppatori grazie alla vasta documentazione presente in Rete; ora però, come conferma lo stesso manuale ufficiale di PHP, a partire dalla versione 5.3 di questo linguaggio, esse sono considerate deprecate e naturalmente non potranno essere utilizzate nemmeno per la release 6 di PHP.

Così, ora accade che coloro che provano ad utilizzare una funzione ereg sulle versioni più recenti di questo linguaggio visualizzino errori simili al seguente:

Deprecated: Function ereg() is deprecated in /home/www/sito/nome_file.php on line 112

Questa breve trattazione è dedicata agli sviluppatori "orfani" delle funzioni ereg e proporrà alcune alternative per rimediare alla loro assenza.

Perché non utilizzare più le funzioni ereg?

L'abbandonato supporto per le funzioni ereg in PHP, spiana la strada all'utilizzo di un'alternativa già contenuta nel linguaggio da lungo tempo, le funzioni preg (o PCRE functions); anch'esse accettano come argomenti delle espressioni regolari e possono essere utilizzate per scopi analoghi a quelli per cui erano destinate le ereg. Ma cosa differenzia le due tipologie di funzioni? E perché alle ereg sono state preferite le PCRE?

Le ereg sono dette anche POSIX Regex Functions, dove POSIX (Portable Operating System Interface UNIX) è il nome di uno standard definito per le applicazioni sviluppate avendo come ambienti di riferimento le varianti dei sistemi operativi UNIX. Esse non richiedono librerie esterne per il loro utilizzo. Le funzioni PCRE (Perl Compatible Regular Expressions) sono invece basate sulle librerie omonime, queste ultime mettono a disposizione un vasta raccolta di funzionalità che permettono di implementare le operazioni di pattern matching (corrispondenza tra stringhe) tramite espressioni regolari, impiegando la stessa sintassi e gli stessi costrutti semantici previsti per il linguaggio di programmazione Perl; libere e gratuite, le librerie PCRE consentono di utilizzare funzioni alternative a quelle basate sullo standard POSIX e inoltre introducono funzionalità aggiuntive.

Compatibilità con Perl a parte, che facilità notevolmente il lavoro per coloro che hanno già familiarità con questo linguaggio, un altro motivo legato al preferito utilizzo delle funzioni basate su PCRE è da ricercarsi nel miglior livello di prestazioni, queste infatti garantiscono una velocità di esecuzione maggiore rispetto alle POSIX; per questo motivo, nonostante la loro permanenza in PHP per lungo tempo, l'utilizzo delle POSIX è sempre stato scoraggiato in favore delle PCRE.

Le funzioni PCRE sono inoltre binary-safe, questo significa che sono in grado di gestire il modo corretto i file binari, possono essere quindi molto utili nel caso in cui ci si trovi a gestire dati dal formato sconosciuto.

Passare dalle funzioni POSIX alle PCRE

Il metodo più veloce, ma anche quello più sconsigliabile per evitare errori dovuti all'utilizzo di funzioni POSIX è quello molto semplice di disabilitare la voce E_DEPRECATED nella direttiva ERROR_REPORTING del file di configurazione di PHP, php.ini; una procedura del genere può aiutare nel caso in cui si debba installare uno script datato ma deve essere considerata come un rimedio momentaneo; del resto passare dall'utilizzo delle funzioni POSIX alle PCRE non è particolarmente complesso, la sintassi prevista per la seconda è leggermente più complessa ma prevede delle regole di facile comprensione.

Si pensi per esempio alla funzione POSIX ereg(), essa viene utilizzata per effettuare riconoscimenti di espressioni regolari, la sua sintassi classica è la seguente:

ereg('pattern', 'stringa');

dove "pattern" è l'espressione regolare da utilizzare e "stringa" è la variabile o il testo su cui effettuare il confronto; al posto di ereg() è invece possibile utilizzare preg_match(), una funzione PCRE che svolge lo stesso compito. Si noti bene però che per utilizzare la seconda al posto della prima non è sufficiente una semplice sostituzione, non sarà quindi possibile correggere il codice proposto in precedenza come segue:

preg_match('pattern', 'stringa');

La sintassi delle espressioni regolari in preg_match() prevede infatti dei delimitatori, gli slash ("/"), quindi una conversione corretta prevede la seguente sintassi:

preg_match('/pattern/', 'stringa');

Il delimitatore di chiusura dovrà essere indicato dopo il pattern e non dovrà essere inserito all'interno di esso, diversamente il confronto con la stringa avverrà soltanto tramite la porzione di pattern compresa tra i primi due delimitatori; se comunque si ha la necessità di introdurre degli slash all'interno dei propri pattern, questi dovranno essere sottoposti ad escape tramite backslash (""), l'esecuzione manuale di questa procedura potrà comunque essere evitata utilizzando l'apposita funzione addcslashes() che si occuperà automaticamente del quoting tramite backslash del pattern.

Si analizzi il seguente esempio:

$pattern = '/<li>.+</li>/';

Il pattern proposto non rispetta la corretta sintassi prevista per le espressioni regolari con la funzione preg_match() in quanto lo slash presente nel tag di chiusura "</li>" viene confuso con un delimitatore del pattern; in questo caso l'escape manuale potrebbe avvenire nel modo seguente:

$pattern = '/<li>.+</li>/';

Ora, grazie al backslash posto davanti allo slash del tag di chiusura, è possibile determinare l'escape di quest'ultimo che non delimiterà più il pattern; lo stesso risultato può essere ottenuto grazie all'azione di addcslashes() che sostituisce la procedura manuale di escape:

$pattern = '<li>.+</li>';
$escaped_pattern = addcslashes($pattern, '/');

Chi ha utilizzato le funzioni POSIX sa che per alcune di esse è disponibile una variante case insensitive in grado di operare dei confronti non tenendo conto della presenza di lettere maiuscole o minuscole; nel caso di ereg(), la sua variante case in sensitive è eregi() che utilizza la stessa sintassi:

eregi('pattern', 'stringa');

Le funzioni PCRE non prevedono invece una variante case in sensitive, ma consentono comunque di ignorare la differenza tra maiuscole e minuscole grazie ad un semplice carattere, la "i" abbreviazione di insensitive, da inserire immediatamente dopo il delimitatore di chiusura del pattern:

preg_match('/pattern/i', 'stringa');

Funzioni PCRE e caratteri ASCII

Una difficoltà nel passaggio dalle funzioni POSIX alle PCRE potrebbe trovarsi nel modo in cui queste interpretano determinate tipologie di caratteri. Si consideri per esempio la funzione ereg_replace() che effettua sostituzioni sulla base di espressioni regolari e ha una sua alternativa nella funzione Perl compatibile preg_replace(); quando si passa un valore numerico a ereg_replace() ma si desidera che questo venga interpretato come il valore ASCII di un carattere (l'American Standard Code for Information Interchange che contiene i codici dei primi 128 caratteri numerati da "0" a "127"), per cui per esempio "13" deve corrispondere al ritorno a carrello ("r") oppure "10" al passaggio ad una nuova linea ("n"), la sintassi POSIX prevede una forma come la seguente:

// valore ASCII per l'inserimento di newline
$newline = 10;
// inserimento di una newline alla fine di una stringa
$sostituzione = ereg_replace('$', $newline, $stringa);

Diversamente, per fare in modo che il numero "10" venga utilizzato letteralmente nelle procedure di sostituzione all'interno di stringhe di testo, esso dovrà essere utilizzato sotto forma di valore stringa:

$valore = '10';

Questa problematica non si verifica invece quando si utilizza la funzione PCRE preg_replace(), essa infatti manipola il numero "10" interpretandolo esattamente per il suo valore letterale, cioè numerico e intero, senza prendere in considerazione il corrispondente valore ASCII; si presenta a questo punto il problema contrario (anche se decisamente meno frequente): come passare un valore ASCII alla funzione evitando che questa venga interpretata come numero? A questo scopo è necessario utilizzare innanzitutto un prefisso, "x", poi si dovrà procedere con una conversione del numero nel suo corrispondente esadecimale; per cui, per esempio, il ritorno a carrello ha un corrispondente esadecimale "0D" mentre per la newline è "0A", il valore da passare a preg_replace sarà quindi "x0d" nel primo caso e "x0a" nel secondo.

In ogni modo, se lo si desidera sarà sempre possibile passare alla funzione una sequenza di escape nel suo formato letterale, quindi "n" per la newline, "t" per la tabulazione e così via.

Conclusioni

Con il rilascio della versione 5.3 di PHP le funzioni ereg per le espressioni regolari POSIX sono state dichiarate deprecate e verranno rimosse dalla release 6 del linguaggio; utilizzarle non è quindi più una buona pratica, chi desidera impiegare un'alternativa potrà farlo grazie alle funzioni PCRE, coloro che sono alle prime armi nello sviluppo di applicazioni in PHP potranno semplicemente imparare l'utilizzo delle PCRE ignorando le POSIX.

Ti consigliamo anche