Seite 1 von 1

Fehlersuche, regulärer Ausdruck für mehrere Zeilen

Verfasst: 21.12.2006 22:07
von Xwitz
Hallo,

warum paßt

Code: Alles auswählen

"/\[url(.*?)url\]/im"
nicht auf einen bbcode-Link der über mehrere Zeilen geht?

Laut Syntax sollte der Ausdruck auf jeden Teil eines Strings passen, der mit "[url" los geht, mit "url]" endet, dazwischen beliebig viele beliebige Zeichen hat (.*), möglichst kurz ist (?) und über eine oder mehrere Zeilen geht (m).

Verfasst: 22.12.2006 11:06
von StarWolf3000
Das PHP-Hanbuch verrät:
m (PCRE_MULTILINE)

Standardmäßig behandelt PCRE eine zu durchsuchende Zeichenkette wie eine einzige Zeile von Zeichen (auch wenn sie tatsächlich mehrere Zeilenumbrüche enthält). Das Metazeichen für einen Zeilenanfang (^) passt nur auf den Anfang der Zeichenkette, das Metazeichen für ein Zeilenende ($) nur auf das Ende der Zeichenkette (falls der Modifikator D nicht gesetzt ist). Das ist genauso wie bei Perl.

Wenn dieser Modifikator gesetzt ist, passen die Zeilenanfang- und Zeilenende-Konstrukte in der Zeichenkette sowohl direkt nach, bzw. vor einem Zeilenumbruch als auch auf deren Anfang und Ende. Das entspricht dem Perl-Modifikator /m. Falls die Zeichenkette keine Sequenz "\n" enthält, oder im Suchmuster kein ^ oder $ vorkommt, hat dieser Modifikator keine Wirkung.
das bedeutet: wenn innerhalb von [ url ] kein echter Zeilenumbruch stattfindet, also \n enthält oder wenn innerhalb des Patterns kein ^ oder $ vorkommt, hilft dir das m für den Multi-Line-Mode nix

Verfasst: 22.12.2006 11:09
von fanrpg

Code: Alles auswählen

"/\[url(.*?)url\]/is"
Anstatt m dürfte wohl s helfen.

Verfasst: 22.12.2006 11:53
von Xwitz
Ich verstehe zwar nicht warum aber s macht was ich will.

Laut http://www.devmag.net/webprog/regulaere_ausdruecke.htm:
Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen - das Pattern wird hierbei also nicht auf die ganze Zeichenkette bezogen, sondern jede Zeile einzeln behandelt

Da denke ich doch, das "[url" und "url]" in einer Zeile vorkommen muß, damit es paßt.

Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.

Da denke ich doch, daß "[url" und "url]" irgendwo in der Reihenfolge vorkommen dürfen, damit es paßt.

Verfasst: 22.12.2006 17:28
von BB-BF-BM
Das Handbuch von php.net ist da einleuchtender:
Suchmuster-Modifikatoren hat geschrieben:s (PCRE_DOTALL)
  • Wenn dieser Modifikator gesetzt ist, passt das Metazeichen Punkt im Suchmuster auf alle Zeichen inklusive Zeilenumbrüche. Ohne diesen Modifikator sind Zeilenumbrüche ausgeschlossen. Dieser Modifikator entspricht dem Perl-Modifikator /s. Unabhängig davon, ob dieser Modifikator gesetzt ist, passt eine verneinende Zeichenklasse wie z.B. [^a] immer auf einen Zeilenumbruch.

Verfasst: 22.12.2006 20:09
von Xwitz
Oh ja, das verstehe ich so, wie es sich auch verhält.