RegEx: Look-back, um eine ungerade Anzahl aufeinanderfolgender Backslashes zu vermeiden

8

Ich habe Benutzereingaben, bei denen einige Tags in eckigen Klammern zulässig sind. Ich habe bereits das Regex-Muster geschrieben, um zu finden und zu validieren, was in den Klammern steht.

Im Benutzereingabefeld konnte die öffnende Klammer ([) mit Backslash versehen werden, auch Backslash konnte mit einem anderen Backslash (\) versehen werden. Ich brauche ein Look-Back-Sub-Pattern, um eine ungerade Anzahl aufeinanderfolgender Backslashes vor der öffnenden Klammer zu vermeiden.

Im Moment muss ich mich mit so etwas beschäftigen:

%Vor%

Es funktioniert gut, aber Problem ist, dass dieser Code immer noch mögliche Paare von aufeinander folgenden Backslashes vor Klammern (auch sie sind ausgeblendet) und Look-Behind nur überprüft, ob es einen anderen Backslash angehängt an Paare (oder direkt zu öffnen ist) -Klammer). Ich muss sie alle nach innen vermeiden, wenn möglich.

Beispiel:

%Vor%

Ich arbeite mit PHP PCRE

    
Wh1T3h4Ck5 08.03.2012, 06:00
quelle

2 Antworten

8

Beim letzten Mal hat PHP keine Look-Behinds variabler Länge unterstützt. Deshalb können Sie die triviale Lösung (?<![^\](?:\\)*\) nicht verwenden.

Die einfachste Problemumgehung wäre, das gesamte Ding, nicht nur den Klammerteil, einfach anzupassen:

%Vor%

Der Unterschied besteht darin, dass Sie jetzt, wenn Sie diese Regex in einem preg_replace verwenden, daran denken müssen, die Ersetzungszeichenfolge durch voranzustellen, um die Backslashes wieder herzustellen.

    
Etienne Perot 08.03.2012, 06:42
quelle
0

Du könntest es ohne irgendwelche Look-Behinds machen ( die (\\|[^\]) Alternation frisst alles außer einem einzigen Schrägstrich ):

%Vor%     
sweaver2112 08.03.2012 10:29
quelle