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<?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<?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<?php
  preg_replace('#aaa(?!x)#', '!', 'aaab'); // '!b'-t ad vissza
?>
Задание 1

Adott egy függvényneveket tartalmazó string:

php<?php
  $str = 'func1() func2() func3()';
?>

Kapjuk meg a függvénynevek tömbjét a stringből.

Задание 2

Adott egy tag-et tartalmazó string:

php<?php
  $str = '<a href="" class="eee" id="zzz">';
?>

Kapjuk meg a tag attribútumainak neveit tartalmazó tömböt.