Forum und email

preg_match_all

(PHP 4, PHP 5)

preg_match_all — Esegue un riconoscimento globale con le espressioni regolari

Descrizione

int preg_match_all ( string $espressione_regolare , string $testo , array $&TestiRiconosciuti [, int $flags [, int $offset ]] )

La funzione ricerca tutte le espressioni regolari passate nel parametro espressione_regolare all'interno della stringa testo . I testi riconosciuti sono posti all'interno della matrice TestiRiconosciuti , nell'ordine specificato da flags .

Dopo avere riconosciuto il primo segmento di testo, le ricerche seguenti saranno effettuate a partire dall'ultima ricerca specificata.

Il parametro flags può essere la combinazione dei seguenti flag (da notare che non ha senso utilizzare PREG_PATTERN_ORDER in unione a PREG_SET_ORDER):

PREG_PATTERN_ORDER

I testi riconosciuti saranno organizzati in modo tale da avere in $TestiRiconosciuti[0] la matrice di tutti i testi riconosciuti, in $TestiRiconosciuti[1] la matrice di tutti i testi che soddisfino il primo criterio di riconoscimento posto tra parentesi tonde, in $TestiRiconosciuti[2] si avranno i testi che soddisfino il secondo criterio e cosi via.

<?php
preg_match_all
("|<[^>]+>(.*)</[^>]+>|U",
    
"<b>example: </b><div align=left>this is a test</div>"
    
$outPREG_PATTERN_ORDER);
echo 
$out[0][0].", ".$out[0][1]."\n";
echo 
$out[1][0].", ".$out[1][1]."\n";
?>

Questo esempio produrrà:

<b>example: </b>, <div align=left>this is a test</div>
example: , this is a test

Nell'esempio, $out[0] contiene la matrice di tutte le stringhe che soddisfano i criteri impostati, $out[1] contiene la matrice dei testi delimitati dai tag.

PREG_SET_ORDER

Usando questo parametro come ordine dei riconoscimenti, si avrà in $TestiRiconosciuti[0] una matrice con il primo set di testi riconosciuti, in $TestiRiconosciuti[1], la matrice con il secondo set di testi riconosciuti e così via.

<?php
preg_match_all
("|<[^>]+>(.*)</[^>]+>|U",
    
"<b>example: </b><div align=\"left\">this is a test</div>",
    
$outPREG_SET_ORDER);
echo 
$out[0][0].", ".$out[0][1]."\n";
echo 
$out[1][0].", ".$out[1][1]."\n";
?>

Questo esempio visualizzerà:

<b>example: </b>, example: 
<div align="left">this is a test</div>, this is a test

In questo esempio $out[0] è la matrice del primo set di testi riconosciuti. Nel dettaglio $out[0][0] conterrà il testo che incrocia l'intero criterio impostato, $out[0][1] conterrà il testo riconosciuto tramite il prima regola di riconoscimento presente nel criterio globale. Analogo discorso si può fare per $out[1]. In questo caso il ragionamento verrà svolto su un secondo segmento della stringa che soddisfi le condizioni poste dal criterio di riconoscimento.

PREG_OFFSET_CAPTURE

Se viene impostato questo flag, per ogni testo riconosciuto viene restituito l'offset della stringa. Occorre notare che questo cambia il tipo di valore restituito nell'array, infatti ogni elemento è, a sua volta, un'array composto dalla stringa riconosciuta, all'indice 0, e dall'offset della stringa nell'indice 1. Questa costante è disponibile a partire dalla versione 4.3.0 di PHP.

Qualora non si specifichi il parametro flags , si assume per default il valore PREG_PATTERN_ORDER.

Normalemente la ricerca parte dall'inizio della stringa oggetto di ricerca. Con il parametro opzionale offset si può specificare da dove cominciare la ricerca. Equivale a passare substr()($testo, $offset) alla funzione preg_match() al posto del parametro testo. Il parametro offset è disponibile a partire dalla versione 4.3.3 di PHP.

La funzione restituisce il numero dei riconoscimenti completi svolti (che possono essere zero), oppure FALSE se si verificano degli errori.

Example#1 Esempio di come ottenere tutti i numeri di telefono da un testo.

<?php
preg_match_all
("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] ) \d{3}-\d{4}/x",
                
"Call 555-1212 or 1-800-555-1212"$numeri);
?>

Example#2 Ricerca di tag HTML

<?php
// Il parametro \\2 è un esempio di riferimento all'indietro. Questo dato informa la 
// libreria pcre che deve considerare il secondo set di parentesi tonde (in questo 
// caso il testo "([\w]+)"). Il backslash (\) aggiuntivo è reso obbligatorio dall'uso
// dei doppi apici.
$html "<b>bold text</b><a href=howdy.html>click me</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/"$html$matches);

for (
$i=0$icount($matches[0]); $i++) {
   echo 
"intero criterio: ".$matches[0][$i]."\n";
   echo 
"parte 1: " $matches[1][$i] . "\n";
   echo 
"parte 2: " $matches[3][$i] . "\n";
   echo 
"parte 3: " $matches[4][$i] . "\n\n";
}
?>

Questo esempio visualizzerà:

intero criterio: <b>bold text</b>
parte 1: <b>
parte 2: bold text
parte 3: </b>

intero criterio: <a href=howdy.html>click me</a>
parte 1: <a href=howdy.html>
parte 2: click me
parte 3: </a>

Vedere anche preg_match(), preg_replace() e preg_split().