2016-05-15 9 views
0

Ok, also habe ich versucht, den ganzen Tag herauszufinden, wie man mit verschiedenen regulären Ausdrücken in PHP rumspielt. Ich habe eine Zeichenfolge wie folgt:PHP Regex: Übereinstimmende Nicht-Escape-Zeichengruppen

$str = "this is a(n) {item} made by {username}. Watch out for \\{escaped} items. This one is \\\\{notescaped}."; 

Ich brauche die nicht geschützten Gruppen von geschweiften Klammern zu erfassen. Ich plane, die Zeichenfolge an den Gruppen (geschweifte geschweifte Klammern) in ein Array unter Verwendung preg_split zu teilen, damit ich später die Lücken mit den benötigten Informationen füllen kann.

das Ergebnis sollte also sein:

// After preg_split 
array (
    [0] => "this is a(n) ", 
    [1] => " made by ", 
    [2] => ". Watch out for {escaped} items. This one is \\", 
    [3] => "." 
); 

// Captured delimiters from preg_split 
array(
    [0] => "{item}", 
    [1] => "{username}", 
    [2] => "{notescaped}", 
); 

Ich weiß, wie einfach die Gruppe erfassen den Grund \{.*\} aber ich brauche, um mit sicher, dass es nicht entgangen war. So etwas wie \\\\\\{escaped} (3 Backslashes) würde immer noch es entkommen. Außerdem können die Zeichen innerhalb der geschweiften Klammern ein beliebiges Zeichen, nichts Spezifisches und nichts sein, das auf Entweichen überprüft werden muss. Jede Hilfe wird sehr geschätzt!

Antwort

1

Umgekehrte Schrägstriche ein Schmerz zu handhaben sind, aber dies alles finden wird zwischen "unescaped" Zahnspange:

(?<=^|[^\\])(?:[\\]{4})*[{]([^}]*)[}] 

Als Zeichenfolge, wird es dieses Monster:

$re = "~(?<=^|[^\\\\])(?:[\\\\]{4})*[{]([^}]*)[}]~s"; 

Im Wesentlichen stellt sicher, es dass vor der Klammer eine gerade Anzahl von Backslashes steht.

+0

Das ist fast so! Ich habe nur ein paar Probleme, es scheint, dass es nicht übereinstimmen wird, wenn das allererste Element im Text eine Gruppe ist, wie '" {this} wird nicht übereinstimmen "', und wenn es ein Leerzeichen zwischen dem Text gibt und die öffnende geschweifte Klammer, dieser Raum ist abgeschnitten. '" einige {item} "=> [" einige "," item "]'. –

+0

@DavidLudwig Korrigiert. Es verwendet jetzt einen positiven Blick hinter entweder einem nicht-umgekehrten Schrägstrich oder dem Anfang der Zeichenfolge. – Laurel

+0

Das war's, vielen Dank! –