27
JAN09RegEx – Lookahead & Lookbehind
Ich möchte euch heute mal die Lookaheads und Lookbehinds (Lookarround) in einem RegEx (Regular Expression) vorstellen. Viele wissen nicht wie man sie genau benutzt und wofür sie eingetlich gut sind. Die nachfolgenden Beispiele können so gut wie in jeder Sprache mit RegEx benutzt werden, sei es bei php, Javascript … oder sogar C#. Meine Beispiele werde ich euch aber in php vorstellen.
Wofür Lookarround?
Eignetlich sagt es ja schon alles, man kann damit prüfen ob Zeichenketten vor oder nach einem Suchstring vorhanden sind. Alles was vor einem String kommt nennt man dann lookbehind und alles was dahinter steht nennt man Lookahead. Folgendes Beispiel soll euch das ganze ein bisschen näher bringen.
Wir haben eine Zeichenkette in der folgendes steht:
Zu den blauen Türen mag Franz die blauen Fenster und blauen Gardinen nicht
Wir wollen jetzt in diesem String das Wort “blauen” ersetzen aber nur an den Stellen wo das “blauen” in Verbindung mit der Tür steht, also das erste. Der reguläre Ausdruck dafür würde so aussehen:
1 2 3 |
$s_suchmuster = "/blauen(?= Türen)/i"; |
Wir können natürlich das ganze noch “negieren”. Normalerweiße würde das mit einem ^ geschehen, hier aber nicht. Ein Positiver lookahead lautet (?=WORT) und ein negierter (?!WORT), man muss hier nur das Vorzeichen = in ein ! schreiben. Das ganze machen wir jetzt noch mit einem Lookbehind. Wir wollen das jedes “blauen” ersetzt wird das nach einem “und” steht, dies würde dann so aussehen:
1 2 3 |
<php
$s_suchmuster = "/(?<= und)blauen/i";
?>
|
Am besten spielt ihr mal ein bisschen mit den Codeschnipsel rum, ihr werdet merken das es garnicht so schwer ist :D Hier eine kleine Zusammenfassung:
Lookahead (nach einem Wort)
- Positiv, d.H. muss folgen (?=WORT)
- Negativ (negiert), d.H. darf nicht folgen (?!WORT)
Lookbehind (vor einem Wort)
- Positiv, d.H. muss davor stehen (?<=WORT)
- Negativ (negiert), d.H. darf nicht davor stehen (?< !WORT)
Zum Abschluss möchte ich noch ein Beispiel von Patrick ansprechen, das ihr auch auf seinem Blog finden könnt. Er hat das Lookahead mit folgendem Beispiel behandelt:
1 2 3 4 5 6 7 |
$string = 'Dies ist ein Text. Aber Text darf nicht ersetzt werden. Nur der Text also.'; echo $string.''; $suchwort = 'Text'; $string2 = preg_replace( '='. $suchwort .'(?!<\/a>)=', ''. $suchwort .'', $string ); echo $string2; |
und zwar möchte er das Suchwort Text in seiner Zeichenkette nur ersetzen wenn es nicht in einem Link-Tag steht. Er prüft hier leider nur ab ob direkt nach dem Suchwort ein </a> stehen hat aber das langt ja vorerst mal. Hier eine Variante von mir die Case-Insensitiv ist und das Suchwort mit dem ersetzt wie er es findet:
1 2 3 4 5 6 7 |
$string = 'Dies ist ein Text. Aber Text darf nicht ersetzt werden. Nur der Text also.'; echo $string.''; $suchwort = 'Text'; $string2 = preg_replace( '/'. $suchwort .'(?!<\/a>)/i', '$0', $string ); echo $string2; |





3 Kommentare
Super erklärt
danke :->
Hi,
I have a message for the webmaster/admin here at http://www.peppies-life.de.
May I use part of the information from your post above if I provide a backlink back to this site?
Thanks,
Peter
Kommentar schreiben