Felix Riesterer: regulärer Ausdruck tut nicht wie ich möchte...

Beitrag lesen

Lieber Hilker,

$text =~ s/(<[^>|"]+>)*"/&amp;/g;

was soll die Pipe "|" im Suchmuster? Eine character class funktioniert schon wie ein "oder". [^>"]+ findet alles, was aus Zeichen besteht, die weder > noch " sind. Wenn in Deinen Strings keine Pipe vorkommt, dann sollte sie in Deinem Suchmuster keine Probleme bereiten, ist aber vom Verständnis her vollkommen falsch dort.

<span style=&amp;color: blue;&amp;>Hier ist ein &amp;Test-text&amp; mit Anführungszeichen</span>

Und die """ im span Tag möchte ich natürlich NICHT ersetzen, sondern nur diejenigen, die NICHT innnerhalb von TAGs sind.

Ich verstehe nichts von der Syntax in Perl und seinen Funktionen, aber kann es sein, dass die Code-Zeile | $text =~ s/(<[^>|"]+>)*"/&amp;/g; unvollständig ist, da sie den Ausdruck in Klammern nicht unverändert in den String zurückschreibt (Backreference)?

In PHP sähe das bei mir so aus:
$text = preg_replace('/(<[^>"]+>)*"/', "$1&amp;", $text);
Das $1 ist die Backreference, die den Treffer des Ausdrucks in der Klammer repräsentiert (und dort wieder einfügt), während alles andere ersetzt wird.

Liebe Grüße aus Ellwangen,

Felix Riesterer.