Fehlersuche, regulärer Ausdruck für mehrere Zeilen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Fehlersuche, regulärer Ausdruck für mehrere Zeilen

Beitrag 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).
Benutzeravatar
StarWolf3000
Mitglied
Beiträge: 1019
Registriert: 25.07.2005 10:20
Wohnort: Stolpen
Kontaktdaten:

Beitrag 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
MOD-Einbauhilfe und Installationen über ICQ, TeamSpeak 2/3 und TeamViewer. Support nur im Forum, eingeschränkt per TeamViewer, aber nicht mehr per PN! • KB:knigge
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag von fanrpg »

Code: Alles auswählen

"/\[url(.*?)url\]/is"
Anstatt m dürfte wohl s helfen.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag 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.
BB-BF-BM
Mitglied
Beiträge: 2179
Registriert: 28.10.2005 16:38
Wohnort: Essen

Beitrag 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.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Oh ja, das verstehe ich so, wie es sich auch verhält.
Antworten

Zurück zu „Coding & Technik“