PHP/Programmazione/Regexp: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Filnik (discussione | contributi)
lunch e poi finisco..
Ramac (discussione | contributi)
fix
Riga 1:
{{stub informatica}}
{{PHP}}
Le '''[[w:espressioni regolari|espressioni regolari]]''' sono uno strumento molto potente, che consente complesse elaborazioni testuali.
 
In questa sede ci limiteremo ad illustrare il funzionamento delle regex su PHP senza però spiegare effettivamente come si scrivono le ''regular expressions'' (cosa infatti non semplice e di certo impossibile da fare in una pagina).
Le espressioni regolari sono uno strumento molto potente, che consente complesse elaborazioni testuali.
 
Per le espressioni regolari sono stati scritti varie funzioni, noi ci limiteremo ad esaminare il '''package PCRE''' (acronimo di "''Perl Compatible Regular Expressions''" ovvero Regex compatibili con Perl). Questa libreria è un ''porting'' in phpPHP di un'altra molto utilizzata e diffusa, scritta per [[w:Perl|Perl]]. Essa viene anche chiamata colloquialmente ''preg_match''.
In questa sede ci limiteremo ad illustrare il funzionamento delle regex su PHP senza però spiegare effettivamente come si scrivono le regular expressions (cosa infatti non semplice e di certo impossibile da fare in una pagina).
 
Per le espressioni regolari sono stati scritti varie funzioni, noi ci limiteremo ad esaminare il package PCRE (acronimo di "Perl Compatible Regular Expressions" ovvero Regex compatibili con Perl). Questa libreria è un porting in php di un'altra molto utilizzata e diffusa, scritta per Perl. Essa viene anche chiamata colloquialmente ''preg_match''.
 
== Prendere dei dati ==
 
Vediamo un esempio di come si utilizza una regex in PHP:
 
<source lang=php>
<?PHPphp
$regex = "/\[\[[Ii]m(?:age|magine):(.*?)\]\]/";
$testo = "[[Immagine:Ciao.jpg]], [[image:hello.jpg]], image:hello.jpg";
Line 21 ⟶ 18:
</source>
 
Se proviamo ad eseguire questo script, avremmootterremo come risultato:
 
<pre>
Line 31 ⟶ 28:
</pre>
 
La regex utilizzata serve per trovare tutte le immagini in [[Aiuto:Markup|markup wiki]]; in particolare restituisce il suo nome reale (ovvero, senza il [[Aiuto:Namespaces|namespace]] immagine).
Vediamo come funziona:
La<br/>In regex prende tutte le immagini presenti suPHP una pagina di wikipedia, in particolare il suo nome reale (ovvero, senza il "namespace"). La regex deve essere definita in una stringa di testo che inizia e finisce con "/" per far capire al motore che quella è una regex e non testo qualunque. La funzione <code>preg_match</code> prende il primo valoreparametro (la regex), lo confronta col secondo (il testo) e resistuisceassegna lail risultato alla variabile indicata come terzo parameetro (nel nostro caso <code>$risultato </code>, che noi mostriamo con la funzione <code>print_r</code>).
 
IlLa variabile di risultato resistuisceconterrà quelloil chetesto "prendeassociato ldall'intera regex" e quellol'evenutale chetesto "prendedei solocosidetti la''backreference'' indicati tra le parentesi" (nel nostro caso rispettivamente $risultato[0] e $risultato[1]). La prima parentesi non viene "presa"restituita come ''backreference'' solo perché è stato utilizzato il modificatore <tt>?:</tt> che indica al motore delle regex di toglierenon ilcontare quelle determinate parentesi per le ''backreference'' a(ciò quellaserve parentesiper inrendere particolarela regex più veloce).
La regex prende tutte le immagini presenti su una pagina di wikipedia, in particolare il suo nome reale (ovvero, senza il "namespace"). La regex deve essere definita in una stringa di testo che inizia e finisce con "/" per far capire al motore che quella è una regex. La funzione preg_match prende il primo valore (la regex), lo confronta col secondo (il testo) e resistuisce la variabile $risultato che noi mostriamo con la funzione print_r.
 
Perché, però, non prende anche image:hello? Perché preg_match prenderestituisce solo la prima occorrenza, per prenderleottenerle tutte bisogna usare preg_match_all:
Il risultato resistuisce quello che "prende l'intera regex" e quello che "prende solo la parentesi" (rispettivamente $risultato[0] e $risultato[1]). La prima parentesi non viene "presa" solo perché è stato utilizzato <tt>?:</tt> che indica al motore di togliere il backreference a quella parentesi in particolare.
 
Perché, però, non prende anche image:hello? Perché preg_match prende solo la prima occorrenza, per prenderle tutte bisogna usare preg_match_all:
 
<source lang=php>
<?PHPphp
$regex = "/\[\[[Ii]m(?:age|magine):(.*?)\]\]/";
$testo = "[[Immagine:Ciao.jpg]], [[image:hello.jpg]], image:hello.jpg";
Line 68 ⟶ 64:
</pre>
 
In questo modo abbiamo quindi sia "il pezzo di codice" che volevamo passare al ''parser'' che il risultato nello specifico.
 
Abbiamo quindi due array annicchiatiannidati dentro un altro, pertanto per accedere al primo basterà usare $risultato[0], mentre $risultato[1] per il secondo. Per accedere invece, per esempio, a Ciao.jpg, basterebbe utilizzare $risultato[1][0].
 
== Sostituire dei dati con degli altri ==
Line 77 ⟶ 73:
 
<source lang=php>
<?PHPphp
$regex = "/<br\s?>/";
?>
</source>
 
== Collegamenti esterni ==
*[http://www.regular-expressions.info/ www.regular-expressions.info] esempi, tutorial e guide sulle regex
 
[[Categoria:PHP|Regexp]]