(PHP 4, PHP 5)
preg_match_all — Esegue un riconoscimento globale con le espressioni regolari
$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
):
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>",
$out, PREG_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.
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>",
$out, PREG_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.
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; $i< count($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().