Siechfred: inhalt zwischen 2 Wörtern auslesen (regex)

Beitrag lesen

/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.