Mehrzeiliges Matching mit RegEx - Druckversion +- PHP Rocks (https://www.php-rocks.de) +-- Forum: PHP Programmierung (https://www.php-rocks.de/https://www.php-rocks.de/forum/1-php-programmierung.html) +--- Forum: PHP Basics (https://www.php-rocks.de/https://www.php-rocks.de/forum/2-php-basics.html) +--- Thema: Mehrzeiliges Matching mit RegEx (/https://www.php-rocks.de/thema/112-mehrzeiliges-matching-mit-regex.html) |
Mehrzeiliges Matching mit RegEx - Arne Drews - 15.09.2016 Hallo, Ich komme grad nicht drauf, wie ich bspw. aus folgendem Text Code: {{ Code: foo:bar // Matching #1 Mein aktueller Stand von mehrfachen Tests sieht so aus: Code: /(?<=\{\{)\s+?test\s+([\w:]+)/ius Die Regel soll lauten: Innerhalb der doppelt geschweiften Klammern alle Werte, die nach der Zeichenfolge "test" kommen, als separates Matching! Ohne die geschweiften Klammern zu berücksichtigen bekomme ich das hin, aber ich möchte explizit vermeiden, dass eine Wertangabe zufällig im normalen Dokumentenbereich existiert und ebenfalls gematcht wird. Wer kann mir einen Schubs in die Richtung geben? Danke RE: Mehrzeiliges Matching mit RegEx - Scarabaeus - 18.09.2016 Moin Nachdem ich jetzt ne Weile auf regex101.com rumprobiert habe, meine Empfehlung: Nimm zwei Mit dem ersten RegEx schauste auf die Klammern und ziehst dir den Inhalt zwischen den Klammern und mit dem zweiten RegEx eben deine Key-Value Paare. Zitat: Was daran liegt, dass dein RegEx vorschreibt, dass in jeder Zeile die zwei geschweiften Klammern exisiteren müssen. Das war auch mein Problem als ich rumprobiert hatte. Egal was ich versuchte: Jene Klammern im Zusammenhang mit den Zeilenumbrüchen haben dazu geführt hatten, dass entweder nur ein oder kein Match aufgetreten ist. Es wäre super wenn mal ein RegEx Guru drüber schauen könnte, ob/wie man das unter Umständen besser lösen könnte. Grüße RE: Mehrzeiliges Matching mit RegEx - Arne Drews - 18.09.2016 Hi, Ich sehe, Dir gings wie mir... Ich habe habe auch auf regex101 rumgedoktort, kam aber ziemlich auf die selben Ergebnisse, wie Du scheint mir. Zitat:Was daran liegt, dass dein RegEx vorschreibt, dass in jeder Zeile die zwei geschweiften Klammern exisiteren müssen.In dem Fall ja, das war jetzt auch nur der aktuelle Stand, habe viele Variationen durchgetestet. Ich werde mir mal überlegen, ob ich das auf zwei RegEx ausweite. Ist nicht meine favorisierte Lösung, aber sollte es nicht anders gehen, muß es wohl sein. Danke für die Zeit, die Du Dir genommen hast. Gruß Arne RE: Mehrzeiliges Matching mit RegEx - Till - 23.09.2016 Und, wie sieht Deine Lösung jetzt aus? RE: Mehrzeiliges Matching mit RegEx - Arne Drews - 23.09.2016 Hi Till, Momentan verzichte ich einfach auf die mehrzeilige Schreibweise, um andere Komponenten zu priorisieren. Sollte ich mich dem Problem wieder annehmen und eine passable Lösung finden, poste ich die gerne hier. Gruß Arne RE: Mehrzeiliges Matching mit RegEx - mermshaus - 27.09.2016 Reguläre Ausdrücke, die für ein Capturing-Pattern eine variable Anzahl an Werten liefern können, sind glaube ich per Design nicht möglich. Etwa ([a-z])* liefert in "abcdef" das letzte Match ("f"), nicht etwa ein Array mit 6 Einträgen. Deshalb ist eine Lösung glaube ich nur mit Lookbehind-Assertions variabler Länge möglich. Die werden von PHPs Regex-Engine aber nicht unterstützt. Die Idee ist, bei jeder Zeile, die mit "test" beginnt, zu schauen, ob sie sich in einem "{{…}}"-Block befindet. Hier ein grobes Beispiel in Python (regex-Modul): Code: import regex Das Beispiel ist noch nicht ganz korrekt. Es müsste in den Assertions noch geprüft werden, dass keine der Zeilen hinter der vorherigen Zeile mit "{{" und vor der nachfolgenden Zeile mit "}}" das jeweils andere Klammernpaar ("}}", "{{") enthält. Sonst werden auch "test"-Zeilen, die zwischen zwei "{{…}}"-Blöcken stehen, gefunden ("bug" im Beispiel). Das habe ich aus Gründen der Lesbarkeit aber nicht hinzuzufügen versucht. Als Fazit bleibt aber, dass das sicherlich kein Problem ist, das besonders sinnvoll mit einem einzigen regulären Ausdruck zu lösen ist. RE: Mehrzeiliges Matching mit RegEx - Arne Drews - 28.09.2016 Hi Marc, Danke für den Anstoß und die Mühe. Aber wie Du schon sagst, unterstützt die RegEx-Engine von PHP keine LookBehind Assertionen variabler Länge, was das ganze doch wieder zu einem Problem macht. Ich überlege nach Deinem Beitrag allerdings, ob ich das Parsen an der Stelle auf Perl auslagere... Egal, wie ich mich entscheide: Danke für den Ansatz. Gruß Arne |