geschützte Zeichen innerhalb der gesuchten regexp ignorieren...
|
Seitenanfang |
Hi, ich habe folgendes Problem. Ich möchte gern Wikitext in HTML umwandeln und dabei sollen geschützte Zeichen welche mit \ markiert sind ignoriert werden.Beispiel:
_Text mit Unter\_Strich_
soll
<em>Text mit Unter_Stich</em>
ersetzt werden.In meinem Versuch werden die geschützten Zeichen als Ende des gesuchten angesehen ;-(
# Text... # my $str="Dieses _Beispiel_ soll alle Worte die mit _Underline_ eingeschlossen sind in _HTML\_Code_ als Kursiv umwandeln. Dabei sollen geschuetzte Zeichen nicht beachtet werden.Das ist _ein Wort\_laut_. Weitere _Wort\_laute_ findet man hier. Das ist ein _schoenes_ Beispiel. "; # Ersetzung... # $str =~ s/_((?:\\_)*[^_]+)_/<i>$1<\/i>/g; # Ausgabe... # print $str;
Weiss jemand eine Lösung..?
Datum: 30.01.2007-21:24

|
re: geschützte Zeichen innerhalb regexp ignorieren...
|
Seitenanfang |
| Hallo! 1. Musst du daran denken, das \ auch in der Skalarzuweisung als Maskierungsoperator interpretiert wird. D.h. du musst dort "_HTML\\_Code_" und "_Wort\\_laute_" schreiben. 2. Dein RA funktioniert trotzdem nicht, ich hab mir jetzt nicht die Mühe gemacht, ihn zu interpretieren um herauszufinden warum. Aber
$str =~ s/_(.*?)(?<!\\)_/<i>\1<\/i>/g; hat bei mir prima funktioniert.Grüße, Skrilax
Datum: 30.01.2007-22:16

|
re: geschützte Zeichen innerhalb regexp ignorieren...
|
Seitenanfang |
| Hmm, du wolltest auch noch die Backslashes vor den Unterstrichen raus haben. Dafür einfach noch nen 2. RA hinterher schieben. $str=~s/\\_/_/g Beides mit einem RA erschlagen, stell ich mir arg schwierig bis unmöglich vor. Außer vielleicht, du weißt wieviele Unterstriche in den Wortgruppen vorkommen sollen. So sind es jedoch zwei verschiedene paar Schuhe: "bestimmte Unterstriche ersetzen" und "Backslashes vor bestimmten Unterstrichen löschen".
Datum: 30.01.2007-22:26

|
re: geschützte Zeichen innerhalb regexp ignorieren...
|
Seitenanfang |
Cool das geht bei mir auch wenn ich die Zeichen im Text mit zwei Backslashes maskiere. $str =~ s/_(.*?)(?<!\\)_/<i>\1<\/i>/g; $str=~s/\\_/_/g;
Ich will aber das der User nur einen Backslash eingibt weil man es ja so gewohnt ist. ich habe versucht die einfach geschützten Zeichen umzuwandeln das geht aber nicht. Weist Du was ich da falsch mache? $str=~s/\_/\\\\_/g; $str =~ s/_(.*?)(?<!\\)_/<i>\1<\/i>/g; $str=~s/\\_/_/g;
Datum: 30.01.2007-22:41

|
re: geschützte Zeichen innerhalb regexp ignorieren...
|
Seitenanfang |
| Ich sagte ja auch, dass das Backslash nur in der Skalarzuweisung (also direkt im Quellcode) so interpretiert wird. Eine Zuweisung mit $str="hallo\_Welt" wird tatsächlich als 'hallo_Welt' abgespeichert. Mit $str="hallo\\_Welt" steht dann ein 'hallo\_Welt' in $str. Genauso, wie es auch als Benutzereingabe kommt, somit ist dort schon alles bestens. Grüße, Skrilax
Datum: 30.01.2007-23:04

|
re: geschützte Zeichen innerhalb regexp ignorieren...
|
Seitenanfang |
Ahh, stimmt. Das sieht man ganz gut wenn man $str vor der Ersetzung ausgiebt.Ok, wenn man den User darauf hinweisst, ist es ja auch kein Problem. Danke nochmals für den Tipp.
Datum: 01.02.2007-23:21

|