Előrenézés a PHP reguláris kifejezéseiben
Időnként a következő típusú feladatot kell megoldanunk: találjunk meg egy
'aaa' stringet és cseréljük ki '!'-ra,
de csak akkor, ha a 'aaa' után
'x' áll, magát a 'x'-et pedig
ne cseréljük ki. Ha a feladatot 'frontális' módon próbáljuk
megoldani, akkor nem fog sikerülni:
<?php
preg_replace('#aaax#', '!', 'aaax'); // '!' lesz, de '!x'-nek kellene
?>
A feladat megoldásához szükség van egy módszerre, amivel
elmondhatjuk, hogy a 'x'-et ne vegye fel a csere részeként. Ez
a speciális zárójelek segítségével történik (?= ),
amelyek csak "odanéznek", de nem "viszik magukkal" a tartalmat.
Ezeket a zárójeleket pozitív előrenézésnek hívják. Pozitív - mivel a 'x'-nek
(a mi esetünkben) jelen kell lennie - csak akkor
történik meg a csere.
Alkalmazzuk ezeket a zárójeleket a feladatunk megoldására:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // '!x'-et ad vissza
?>
Létezik negatív előrenézés is
- (?! ) - ez éppen ellenkezőleg azt mondja, hogy
valamit nem szabad, hogy következzen. A következő példában
a csere csak akkor történik meg, ha a 'aaa'
után nem áll 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // '!b'-t ad vissza
?>
Adott egy függvényneveket tartalmazó string:
<?php
$str = 'func1() func2() func3()';
?>
Kapjuk meg a függvénynevek tömbjét a stringből.
Adott egy tag-et tartalmazó string:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Kapjuk meg a tag attribútumainak neveit tartalmazó tömböt.