Perl und reguläre Ausdrücke
MicVeen
- perl
0 greg0 Stefan Bach0 MicVeen
0 $xNeTworKx0 TorstenA
Einen wunderschönen,
ich habe da folgendes Problem mit Perl und regulären Ausdrücken. In einem String möchte ich verwendete URLs in anklickbare verwandeln.
Der String könnte so z.B. aussehen:
"Weitere Infos finden Sie auf http://www.schlagmichtot.de<br>oder http://www.irgendwas.com<br>" Diesen String möchte ich jetzt mit Perl so modifizieren, dass die Ausgabe folgendermaßen aussieht:
"Weitere Infos finden Sie auf <a href="http://www.schlagmichtot.de">http://www.schlagmichtot.de</a><br>oder <a href="http://www.irgendwas.com">http://www.irgendwas.com</a><br>"
Es ist ja dadurch schon einfacher, dass jeder URL ein Umbruch folgt. Finden kann ich sie also mittels /http://.+?<br/ z.B. Aber das war's dann mit meinem Wissen.
Kann mir jemand vielleicht da weiterhelfen?
Es ist ja dadurch schon einfacher, dass jeder URL ein Umbruch folgt. Finden kann ich sie also mittels /http://.+?<br/ z.B. Aber das war's dann mit meinem Wissen.
Kann mir jemand vielleicht da weiterhelfen?
Ungefähr so?
$foo =~ s|(http://.+)(<br.*)|<a href="$1">$1</a>|;
Hallo,
Ungefähr so?
$foo =~ s|(http://.+)(<br.*)|<a href="$1">$1</a>|;
In diesem Fall würde ja alles hinter der URL einfach weggeputzt. Du hast es aber ja geklammert, also nehme ich an, dass du nach dem </a> noch ein $2 vergessen hast, oder? Und ein "g" würde auch nicht schaden.
Aber eine Frage noch: Muss ich die / escapen wenn sie nicht der Delimiter sind? Dachte eigentlich, dass ich es nicht müsste, habs aber nicht probiert.
Viele Grüße,
Stefan
Halihallo Stefan
Aber eine Frage noch: Muss ich die / escapen wenn sie nicht der Delimiter sind? Dachte eigentlich, dass ich es nicht müsste, habs aber nicht probiert.
aus perldoc perlretut:
<cite>
When, e.g., "" is used as a delimiter, the forward slash '/' becomes an ordinary character and can be used in a regexp without trouble.
</cite>
Viele Grüsse
Philipp
In diesem Fall würde ja alles hinter der URL einfach weggeputzt. Du hast es aber ja geklammert, also nehme ich an, dass du nach dem </a> noch ein $2 vergessen hast, oder? Und ein "g" würde auch nicht schaden.
Wenn ich das hinter der URL stehende nicht ausgeklammere, kommt mein kleines Testprogramm zu komischen Erscheinungen. Das ganze war auch eher ein "Schnellschuss". :)
Aber eine Frage noch: Muss ich die / escapen wenn sie nicht der Delimiter sind? Dachte eigentlich, dass ich es nicht müsste, habs aber nicht probiert.
Das Escapen ist dann nicht notwendig. Aber ich hab vom Ursprungspost copy&paste'd und war faul ;)
greg
Hallo,
URLs in anklickbare verwandeln.
Es ist ja dadurch schon einfacher, dass jeder URL ein Umbruch folgt. Finden kann ich sie also mittels /http://.+?<br/ z.B. Aber das war's dann mit meinem Wissen.
Du musst dir einfach den Teil welcher die URL enthält merken. Dazu dienen die Klammern. Das was geklammert wurde steht dann für die Ersetzung in $1 zur Verfügung. Also sollte eigentlich folgendes funktionieren:
s!(http://.+?)<br>!<a href="$1">$1</a><br>!g
(Du musst nicht unbedingt / als Trennzeichen verwenden. Ein anderes ist vor allem dann sinnvoll, wenn du sonst viele Schrägstriche escapen müsstest.)
Viele Grüße,
Stefan
s!(http://.+?)<br>!<a href="$1">$1</a><br>!g
Dank Dir recht herzlich. Hat wunderbar geklappt. Was mich jetzt ärgert ist, dass ich mir eigentlich absolut sicher bin, dass ich es auf dieser Weise bereits versucht habe. Es kam aber nur kuddelmuddel raus. Nunja, die Hauptsache ist doch, dass ich es verstanden habe :-).
Was wäre aber, wenn ich keinen so eindeutigen Abschluß bei den URLs hätte? Also keine "<br>"s. Es mag zwar sein, dass ich blind bin, aber ich habe kein Zeichen gefunden, welches Leerzeichen innerhalb eines regulären Ausdrucks darstellen kann. Außerdem könnte die URL ja auch am Ende stehen.
Vielen Dank nochmals für die Hilfe!
Grüße,
Mic
Halihallo MicVeen
Was wäre aber, wenn ich keinen so eindeutigen Abschluß bei den URLs hätte? Also keine "<br>"s. Es mag zwar sein, dass ich blind bin, aber ich habe kein Zeichen gefunden, welches Leerzeichen innerhalb eines regulären Ausdrucks darstellen kann.
Ein Leerzeichen? - Das bleibt genau das, was es ist: Ein Leerzeichen.
Außerdem könnte die URL ja auch am Ende stehen.
Tja, dann:
s!(http://.+?)(\s|$)!<a href="$1">$1</a>$2!g;
http:// gefolgt von einer Zeichenkette bis zum ersten \s (White-Space, u.a. eben auch
das Leerzeichen) oder dem Zeichenkettenende. Der White-Space soll dann natürlich dem
Replace angehängt werden ($2).
Viele Grüsse
Philipp
Ein Leerzeichen? - Das bleibt genau das, was es ist: Ein Leerzeichen.
Das war mir dann wohl zu naheliegend ;-).
s!(http://.+?)(\s|$)!<a href="$1">$1</a>$2!g;
Ja Mensch. Da habe ich ja was zu lernen.
Dank Dir für die Hilfe. Hat mich ein Stück weiter im Leben gebracht.
Viele Grüße,
Mic
Hola,
"Weitere Infos finden Sie auf http://www.schlagmichtot.de<br>oder http://www.irgendwas.com<br>"
$text =~ s/(\s|^)(http://[A-Za-z0-9.-=&%/?\;#_]+)<br>/$1<a href="$2">$2</a><br>/sg;
sollte eigentlich funktionieren, wenn man alle Sondertzeichen berücksichtigt, die in einem Link vorkommen dürfen.
$xNeTworKx.
Hi $xNeTworKx,
[...] [A-Za-z0-9.-=&%/?\;#_] [...]
Die Sonderzeichen in Zeichenklassen werden behandelt als das, was sie sind, du musst sie also nicht escapen.
Viele Grüße
Torsten
Hallo,
danke für den Tipp.
greetz.