Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9113[/thread]

Regex-Frage: \b und \B bei Sonderzeichen



<< >> 3 Einträge, 1 Seite
svwcharly
 2007-06-23 01:15
#77755 #77755
User since
2007-06-23
1 Artikel
BenutzerIn
[default_avatar]
Hallo, ich habe ein Regex-Problem.
In einem HTML-Text sollen bestimmte Zeichenketten kursiv oder fett hervorgehoben werden, aber nur, wenn die Zeichenkette als ganzes Wort auftaucht oder am Anfang oder am Ende steht.

Als Beispiel:
$text = " &auml;rztliche fach&auml;rztlich &auml;rztlich";
$such = "&auml;rztlich";
$text =~ s/\B($such)\b/>>$1<</ig;
$text =~ s/\b($such)\B/>>$1<</ig;
$text =~ s/\b($such)\b/>>$1<</ig;

Das Ergebnis ist:
&auml;rztliche fach>>&auml;rztlich<< >>&auml;rztlich<<

Also die Zeichenkette am Anfang des 1. Wortes (&auml;rztliche) wird nicht hervorgehoben, trotz \b ... \B
Kann mir das einer erklären? Und wie kann man das Problem lösen? Ein einfaches
$text =~ s/($such)/>>$1<</ig;
hilft nicht, weil dann auch in der Mitte von Wörtern hervorgehoben wird, also Suchwort "usa" wird dann auch gefunden in "zusammen" usw.

Danke für Eure Tipps!
SVW-Charly
ptk
 2007-06-23 01:35
#77756 #77756
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Dein Problem ist, dass die Mitte des Strings " &" (space ampersand) eben nicht auf \b matcht, weil weder die rechte noch die linke Seite aus Buchstaben besteht, die Voraussetzung für einen \b-Match.

Wenn du die Möglichkeit hast, zuerst das Highlighning vorzubereiten und erst dann HTML-Escaping zu machen, dann solltest du diesen Wert gehen. Oder du baust dir die Regexpes aus look-behind und look-ahead assertions zusammen. Siehe perlre.
moritz
 2007-06-23 02:32
#77757 #77757
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Vielleicht möchtest du ja so etwas verwenden:
Code: (dl )
s/(?:^|(?=\W))(\Q$such\E)(?:$|(?<=\W))/>>$1<</g


(vorsicht, ungetested).
Das
1) interpretiert $such als String, nicht als regex
2) schaut, ob davor (?=...) ein Nicht-Wort-Zeichen oder der Anfang des Strings ist
2) schaut, ob danach (?<=...) ein Nicht-Wort-Zeichen oder das Ende des Zeichens ist.

Regexes sind toll ;-)
<< >> 3 Einträge, 1 Seite



View all threads created 2007-06-23 01:15.