Hallo geehrtes Forum,
ich will mittels eines RegEx Ausdrücke in einem Text markieren. Das funktioniert auch wie gewünscht, bis auf eine Ausnahme: wenn ein Ausdruck mit einem bereits markierten Ausdruck überlappt.
So wird markiert:
my $mark1 = '<span style="color:blue">';
my $mark2 = '</span>';
foreach my $word ( @markwords ) {
$text =~ s/$word/$mark1$word$mark2/gmsi;
}
Wenn jetzt in einem Text bereits der Ausdruck 'Italiener um die Ecke' markiert ist, sieht es so aus:
Ich gehe gerne beim <span style="color:blue">Italiener um die Ecke</span> essen.
Nun kommt als nächstes der Ausdruck 'beim Italiener'. Da matcht der RegEx natürlich nicht mehr, da die Markierung nach dem Leerzeichen steht. Ich habe versucht, in den Regex die Möglichkeit des Auftauchens einer Markierung einzubauen, mit:
foreach my $word ( @markwords ) {
$word =~ s/ / (?:$mark1|$mark2)?/gsm;
$text =~ s/$word/$mark1$word$mark2/gmsi;
}
Damit dachte ich würde der Ausdruck verändert zu 'beim (?:<span style="color:blue">|</span>)?Italiener', was dann ja matchen müßte. Tut es aber nicht. Ich nehme mal an, ich habe einen Denkfehler gemacht. Kann den jemand sehen?
Besten Gruß
JOhnnY