Manuale PHP
Indietro |  | Avanti

# preg_match_all

(PHP 3 >= 3.0.9, 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>", $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.

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>", $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.

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.

Esempio 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); ?>`

Esempio 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().

Indietro | Partenza | Avanti
preg_grep | Risali | preg_match