Lookahead in PHP Regex
Manchmal muss man eine Aufgabe dieser Art lösen: finde
die Zeichenkette 'aaa' und ersetze sie durch '!',
aber nur wenn nach 'aaa' ein
'x' folgt, wobei das 'x' selbst
nicht ersetzt werden soll. Wenn wir versuchen, die Aufgabe
'auf direktem Wege' zu lösen, werden wir scheitern:
<?php
preg_replace('#aaax#', '!', 'aaax'); // ergibt '!', aber '!x' ist benötigt
?>
Um die Aufgabe zu lösen, wird eine Möglichkeit benötigt,
zu sagen, dass das 'x' nicht ersetzt werden soll. Dies
wird mit Hilfe spezieller Klammern (?= ) erreicht,
die nur prüfen, aber nicht mit aufnehmen.
Diese Klammern werden positives Lookahead genannt.
Positiv - weil 'x'
(in unserem Fall) vorhanden sein muss - nur dann
findet die Ersetzung statt.
Wenden wir diese Klammern zur Lösung unserer Aufgabe an:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // gibt '!x' zurück
?>
Es gibt auch ein negatives Lookahead
- (?! ) - dieses sagt im Gegensatz dazu, dass
etwas nicht vorhanden sein darf. Im folgenden Beispiel
findet die Ersetzung nur statt, wenn nach 'aaa'
kein 'x' folgt:
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // gibt '!b' zurück
?>
Gegeben ist ein String, der Funktionsnamen enthält:
<?php
$str = 'func1() func2() func3()';
?>
Erhalten Sie ein Array der Funktionsnamen aus dem String.
Gegeben ist ein String mit einem Tag:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Erhalten Sie ein Array der Attributnamen dieses Tags.