/sss:(.*)(?=ttt:)/
Funktionieren PHP-RegExps anders?
M.E. nicht, wenn du die Perl-kompatible Syntax verwendest (PCRE).
In Perl erhalte ich: »das ist der text ttt:«.
my $text = my $such = "sss:das ist der text ttt:";
$such =~ s/sss:(.*)(?=ttt:)/$1/;
print $such; # Ausgabe: das ist der text ttt:
Schau doch mal, was dein Code macht. Er sucht innerhalb des Ausgangsstrings nach dem vorgegebenen Muster und ersetzt es durch das, was geklammert wurde. Die Besonderheit ist jetzt, dass (?=ttt:) eine nicht-gruppierende Klammer ist, das Ergebnis also nicht in den RegExp einbezogen wird. Der Ausdruck lautet nämlich: Finde ein 'sss:' und alles, was folgt, bis du auf 'ttt:' stößt, was bedeutet, dass das Lookahead-Konstrukt nicht Bestandteil des zu suchenden und ersetzenden Stringteils ist. Mache mal Folgendes:
~~~perl
my $text= "sss: hallo ich bin der text ttt:";
$text =~ s/sss:(.*)(?=ttt:)/>$1</;
print $text;
Das dürfte die Erleuchtung sein :)
Zu dem empfohlenen Modifier »s«. Ist es nicht so, dass »s« lediglich bewirkt, dass ».« auch auf Newline-Zeichen matcht (ohne »s« halt nicht). Warum nicht den Modifier »m« in dem Fall?
Weil //m bedeutet, dass die Zeichenklasse '.' auf alles *außer* Newlines matcht, während //s die Newlines einschließt.
Siechfred
--
Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.