preg_match_all

(PHP 3>= 3.0.9, PHP 4 )

preg_match_all -- Reguláris kifejezés teljeskörű illesztését végzi

Leírás

int preg_match_all ( string pattern, string subject, array matches [, int flags])

A subject szövegben megkeresi az összes, a pattern mintára illeszkedő részt, és a matches tömbbe menti azokat az order paraméterben meghatározott sorrendben.

Amint az első illeszkedés megtalálta, a soron következő illesztést az utolsó illeszkedés végétől folytatja.

A flag paraméter az alábbi értékek kombinációja lehet (bár értelmetlen a PREG_PATTERN_ORDER-t és a PREG_SET_ORDER-t együtt használni):

PREG_PATTERN_ORDER

Azt eredményezi, hogy a $matches[0] olyan tömb lesz, ahol az összes a teljes mintára illeszkedő szövegrész lesz egymás után, a $matches[1] tömbben pedig azok a szövegrészek, amelyek első "gyűjtő" részmintára illeszkednek, és így tovább.

preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
    "<b>példa: </b><div align=left>ez itt a teszt szöveg</div>",
    $out, PREG_PATTERN_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n"

Ez a példa az alábbi eredményt adja:
<b>példa: </b>, <div align=left>ez itt a teszt szöveg</div>
példa: , ez itt a teszt szöveg

Tehát, az $out[0] egy tömb az összes, teljes mintára illeszkedő szöveggel, és $out[1] egy tömb az összes HTML-elem közti szöveggel.

PREG_SET_ORDER

Azt eredményezi, hogy $matches[0]-ben az első illesztés eredményeit, a $matches[1] a másodikét fogja tartalmazni, és így tovább.

preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
    "<b>példa: </b><div align=left>ez itt a teszt szöveg</div>",
    $out, PREG_SET_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n"

Ez a példa az alábbi eredményt adja:
<b>példa: </b>, példa:
<div align=left>ez itt a teszt szöveg</div>, ez itt a teszt szöveg

Ebben az esetben $matches[0] az első illesztés során megtalált szövegrészeket tartalmazza, a $matches[0][0]-ban a teljes mintára illeszkedő szöveggel, $matches[0][1]-ban az első "gyűjtő" részmintára illeszkedő résszel, és így tovább. Ehhez hasonlóan $matches[1] a második illesztés során megtalált szövegeket tartalmazza, stb.

PREG_OFFSET_CAPTURE

Minden egyezéshez az egyezés kezdőpozícióját is visszaadja az eredményben. Ez maga után vonja, hogy a visszaadott tömb minden eleme olyan tömb lesz, amelynek a 0. indexe az illeszkedő szöveget tartalmazza, míg az 1. indexen levő elem ennek a subject-en belüli kezdőpozicióját. Ez a jelzőbit PHP 4.3.0 verziójától használható.

Ha nincs megadva a flag paraméter, akkor az alapértelmezés a PREG_PATTERN_ORDER.

Ez a függvény az összes illeszkedés számával tér vissza (ami lehet akár 0 (!) is sikertelen illesztés esetén), vagy FALSE-szal hiba esetén.

Példa 1. Az összes telefonszám kigyűjtése egy adott szövegből.

preg_match_all ("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] ) \d{3}-\d{4}/x",
                "Hívd a 555-1212 vagy 1-800-555-1212 számot", $phones);

Példa 2. HTML elemek keresése (mohón)

// A \\2 példa a "gyűjtő" részmintára történő hivatkozásra. Ez mondja meg
// PCRE-nek, hogy a másodikként megadott kerek zárójelre - ami ebben az
// esetben ([\w]+) - illesztett szövegnek kell szerepelnie a hivatkozás
// helyén is. A plusz visszaperjelre azért van szükség, mert a minta
// macskakörmök ("") közé van fogva.
$html = "<b>félkövér szöveg</b><a href=howdy.html>kattints ide</a>

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

for ($i=0; $i < count($matches[0]); $i++) {
echo "passzolt: ".$matches[0][$i]."\n";
echo "1. rész: ".$matches[1][$i]."\n";
echo "2. rész: ".$matches[3][$i]."\n";
echo "3. rész: ".$matches[4][$i]."\n\n";
}
A példa ezt eredményezi:
passzolt: <b>félkövér szöveg</b>
1. rész: <b>
2. rész: félkövér szöveg
3. rész: </b>

passzolt: <a href=howdy.html>kattints ide</a>
1. rész: <a href=howdy.html>
2. rész: kattints ide
3. rész: </a>

Lásd még: preg_match(), preg_replace(), és preg_split()!