PHP/Programmazione/Regexp: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
lunch e poi finisco.. |
fix |
||
Riga 1:
{{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
▲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>
<?
$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,
<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).
▲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
▲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>
<?
$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
== Sostituire dei dati con degli altri ==
Line 77 ⟶ 73:
<source lang=php>
<?
$regex = "/<br\s?>/";
?>
</source>
== Collegamenti esterni ==
*[http://www.regular-expressions.info/ www.regular-expressions.info] esempi, tutorial e guide sulle regex
[[Categoria:PHP|Regexp]]
|