RegExp will nicht so wie ich will
mormel
- perl
Hallo,
ich möchte in einer Datei in z.B.
<a href="eins/zwei/drei/foo.html">blabla</a>
foo durch bar und .html durch .jsp ersetzen, so dass hinterher
<a href="eins/zwei/drei/bar.jsp">blabla</a>
in der Datei steht.
$fin =~ s%(<a href=")((?!http|>).*?/)((?!/).*?)(.html)(".*?</a>)%%gis;
(das ersetzen habe ich der Übersichtlichkeit halber wegelassen)
Alles funktioniert, bis auf die Tatsache, dass in $3 nun
eins/zwei/drei/foo steht und nicht nur foo. Ich sitze jetzt schon
über 1h an diesem RegExp und weiss nun nicht mehr weiter. Alle meine
Versuche bringen entweder kein oder ein völlig falsches Ergebnis.
Ich bin heute irgendwie zu blöd, das hinzubekommen, sollte doch
eigentlich ganz einfach sein, oder?
Bitte helft mir auf die Sprünge.
Danke, mormel
Halihallo mormel
$fin =~ s%(<a href=")((?!http|>).*?/)((?!/).*?)(.html)(".*?</a>)%%gis;
(das ersetzen habe ich der Übersichtlichkeit halber wegelassen)
$t = '<a href="eins/zwei/drei/foo.html">blabla</a>';
$t =~ s/<a href="(.*?).(.*?)">/<a href="$1.jsp">/gi;
print $t;
gehe immer von dem Einfachen aus und kompliziere dann. Bereits vom Komplexen auszugehen
macht unübersichtlich und verwirrt. Erweitern ist einfacher als Reduzieren.
Das obige Beispiel hat bei mir schonmal funktioniert, füge zusätzliche Abfragen ein,
sodass es deiner Aufgabenstellung entspricht.
Viele Grüsse
Philipp
Hallo mormel,
Schauen wir uns doch Deinen Ausdruck mal an:
| $fin =~ s%(<a href=")((?!http|>).*?/)((?!/).*?)(.html)(".*?</a>)%%gis;
^^^^ ^^^^^
(1) (2)
(1) Dieser Ausdruck ist nicht greedy, also bekommt er sowieso nur alles bis zum ersten / mit.
(2) Diese Assertion ist nicht notwendig, da Du ja bereits vorher am /-Zeichen Schluss machst.
Daher: Der Ausdruck muss greedy werden. Problem dabei: Er frisst dann viel zu viel. Also muss man hier ein bisschen tricksen:
$fin =~ s%(<a\s+href=")((?!http|>)[^"]+/)(.*?)(.html)(".*?</a>)%$1$2bar.jsp$5%gis;
Das "-Zeichen begrenzt ja den Attributwert - innerhalb des Attributes kann ich aber ruhig einen Ausdruck, der greedy ist, verwenden.
sollte doch eigentlich ganz einfach sein, oder?
Es ist nicht trivial, wie Du siehst. Ich möchte mir desweiteren nicht ausmalen, was der Ausdruck anstellt, wenn Du ihn auf invalides HTML anwendest...
Christian
Hallo,
$fin =~ s%(<a\s+href=")((?!http|>)[^"]+/)(.*?)(.html)(".*?</a>)%$1$2bar.jsp$5%gis;
Danke, funktioniert prima!
Es ist nicht trivial, wie Du siehst. Ich möchte mir desweiteren nicht ausmalen, was der Ausdruck anstellt, wenn Du ihn auf invalides HTML anwendest...
Da die Seiten von mir erstellt worden sind, kann ich von validen
Dokumenten und Links in o.a. Form 100%-ig ausgehen.
Vielen Dank
mormel