HTML-Link erstellen
Sascha
- perl
0 Jörg Peschke0 Sebastian0 Dennis- php
0 saltun
Hallo Leute,
ich bekomme in einer Variable einen beliebig langen Text.
Dieser Text wird später mit print ausgeben.
Dieser Text kann auch einen Internet-Link enthalten (http://......)
Nun will ich das dieser Link erkannt und in einen html-link umgewandelt wird.
z.B.:
$text = "Das ist ein Test. http://www.test.de TOLL";
soll in
$text = "Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL";
umgewandelt werden.
Alle meine bisherigen Versuche das mit regulären Ausdrücken hinzubekommen sind fehlgeschlagen!
WER KANN MIR HELFEN?
Danke
Sascha
Moin,
z.B.:
$text = "Das ist ein Test. http://www.test.de TOLL";soll in
$text = "Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL";
umgewandelt werden.
Schuss ins blaue (habs nicht getestet):
$text =~ s/(http://\S+)\s*(\S+)/<a target='_blank' href="$1">$2</a>/gis;
Gruss,
Joerg
äh, falsch, sorry:
$text =~ s/(http://\S+)/<a target='_blank' href="$1">$1</a>/gis;
meinte ich :)
Tag Jörg.
$text =~ s/(http://\S+)/<a target='_blank' href="$1">$1</a>/gis;
Ähm, was passiert wenn ich sowas schreibe:
Nähere Infos findest du in Google (http://www.google.de).
Nähere Infos findest du unter http://www.google.de.
Nene, so geht das nicht :)
Der RegEx im Posting von Dennis sieht da schon besser aus.
Siechfred
Moin,
Nene, so geht das nicht :)
Ok, ich bin davon ausgegangen, dass Links immer die gleiche form wie im Beispiel angegeben haben (durch Leerzeichen getrennt vom restlichen Text) haben.
Dann muss hanstatt des \S+ eine entsprechende Zeichenklasse rein
sowas wie [a-zA-z0-9./%...oehm, und was halt noch alles in einem Link stehen darf.
Die Begrenzung von "mindestens 3" in Dennis posting "(3,)"
funzt aber nicht, z.B.:
http://selfhtml.org
kriegt man damit nicht.
Tag Jörg.
Nene, so geht das nicht :)
Ok, ich bin davon ausgegangen, dass Links immer die gleiche form wie im Beispiel angegeben haben (durch Leerzeichen getrennt vom restlichen Text) haben.
Naja, Links zu parsen ist nicht wirklich einfach, vielleicht hilft dem OP dieser RegExp oder gar das komplette Modul weiter (habe es mir nicht näher angesehen).
Siechfred
Hi Jörg,
Die Begrenzung von "mindestens 3" in Dennis posting "(3,)"
funzt aber nicht, z.B.:
http://selfhtml.org
kriegt man damit nicht.
erst mal: {3,} (geschwungene Klammer)
ähm, warum sollte das auf http://selfhtml.org nicht matchen?
\__________/
sind doch wohl mehr als 3 Zeichen
MfG, Dennis.
Versuchs damit:
$text =~ s/(http://.* )/<p><a target="_blank" href="$1">$1</a></p>/g;
nicht getestet
Versuchs damit:
$text =~ s/(http://.* )/<p><a target="_blank" href="$1">$1</a></p>/g;
nicht getestet
Moment, so wäre besser
$text =~ s/(http://.*\ )/<p><a target="_blank" href="$1">$1</a></p>\ /g;
Hi Sascha,
Alle meine bisherigen Versuche das mit regulären Ausdrücken hinzubekommen sind fehlgeschlagen!
Also folgendes hat sich bei mir mit PHP bewährt, das wandelt http://, ftp:// und mailto: Links um, wobei das Title Attribut entsprechend angepasst wird und mailto: Links nicht in einem neuen Fenster geöffnet werden:
//Externe Links aus dem Text herrausfiltern
$links = preg_match_all("=<(http://|ftp://|mailto:)([a-zA-Z0-9._-:?&/=@#~>{3,})]=U", $text, $treffer);
//Und durch HTML Link ersetzen
if($links)
{
foreach($treffer[0] as $key => $value)
{
$link = "<a href="".$treffer[1][$key].$treffer[2][$key].""";
if($treffer[1][$key] == "mailto:") $link .= " title="E-Mail schreiben">".$treffer[2][$key]."</a>";
else $link .= " title="Externer Link" target="_blank">".$treffer[1][$key].$treffer[2][$key]."</a>";
$text = str_replace($value, $link, $text);
}
}
Vielleicht kriegst du das ja zu Perl umgemurkst ;-)
Ansonsten kann es vielleicht ein anderer brauchen....
MfG, Dennis.
Hallo!
$text = "Das ist ein Test. http://www.test.de TOLL";
soll in
$text = "Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL";
umgewandelt werden.
Unten wurde schon fast eine funktionierende Lösung vorgeschlagen.
Einige Backslash zur Maskierung wären dort noch notwendig.
So sollte es funktionieren:
$text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;
Grüße
saltun
So sollte es funktionieren:
$text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;
oh ja stimmt, aber man sollte doch folgendes benutzen
$text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;
Gruß
Sebastian
Hallo Sebastian!
So sollte es funktionieren:
$text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;oh ja stimmt, aber man sollte doch folgendes benutzen
$text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;
Der String, auf den die RegExp angewandt werden soll lautet:
$text = "Das ist ein Test. http://www.test.de TOLL";
Mit (http://.*) speicherst Du "http://www.test.de TOLL" in $1.
Die Ausgabe ist dann ....href='http://www.test.de TOLL'>http://www.test.de TOLL</a></p>.
Deshalb braucht man das Ende der URL, also hier .de. Das Fragezeichen ist beim gegenständlichen
String nicht notwendig, hat aber den Sinn, Perl dazu zu bringen, beim ersten .de aufzuhören.
Probier einfach einmal dieses kleine Perl-Script aus:
#!/usr/bin/perl
$text = "Das ist ein Test. http://www.test.de TOLL ";
$text=~s/(http://.*?.de)/<p><a target='_blank' href='$1'>$1</a></p>/;
print ("$text\n");
Nimm dann das Fragezeichen weg und probier das Script mit dem String
$text = "Das ist ein Test. http://www.test.de TOLL und jetzt kommt noch ein .de";
und Du wirst sehen was ich meine.
Grüße
saltun
Hi Satun,
bei meinem Code ist die URL bei einem Leerzeichen zu ende!!!
$text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;
dafür sorgt das \ in der Funktion hinter der Klammer!!!
Gruß Sebastian
Hallo!
Hi Satun,
bei meinem Code ist die URL bei einem Leerzeichen zu ende!!!
$text=~s/(http://.*)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;dafür sorgt das \ in der Funktion hinter der Klammer!!!
Dein Code gibt den folgenden String aus:
Das ist ein Test. <p><a target='_blank' href='http://www.test.de TOLL'>http://www.test.de TOLL</a></p>
Das " TOLL " soll jedoch nicht in der URL selber stehen. Das Ergebnis, das Sascha will, soll so
Das ist ein Test. <p><a target='_blank' href='http://www.test.de'>http://www.test.de </a></p>TOLL
aussehen. Das Wort TOLL soll n a c h dem </p> stehen.
Grüße
saltun
trotzdem besteht das im meinem anderen Post genannte Problem, dass das ganze nur mit .de geht und wenn mann zumbespiel an die Addresse ?typ=0&test=0 dranhängt das ganze nicht mehr funktioniert !!!
Gruß
Sebastian
Hallo Sebastian!
trotzdem besteht das im meinem anderen Post genannte Problem, dass das ganze nur mit .de geht und wenn mann zumbespiel an die Addresse ?typ=0&test=0 dranhängt das ganze nicht mehr funktioniert !!!
Du hast mit dem Leerzeichen als Begrenzung der URL natürlich recht, da in einer URL kein Leerzeichen vorkommen darf. (Ich sehe manchmal den Wald vor lauter Bäumen nicht).
Das Fragezeichen ist allerdings dann notwendig, wenn nach der URL mehr als ein Wort steht.
Grüße
saltun
Hi Saltun
Folglich wäre der passende Parser für ihn folgender:
$text =~ s/(http://.*?)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;
Leider funktioniert der nicht bei z.B.:
$text = "Das ist ein Test.<br>Link: http://www.test.de |Ende des Links|<br> Noch nen Link: http://www.test.domain.de";
hier wird nur der erste Link geändert, wie nicht der zweite?
Hallo Sebastian!
Folglich wäre der passende Parser für ihn folgender:
$text =~ s/(http://.*?)\ /<p><a target='_blank' href='$1'>$1</a></p>/g;
Leider funktioniert der nicht bei z.B.:
$text = "Das ist ein Test.<br>Link: http://www.test.de |Ende des Links|<br> Noch nen Link: http://www.test.domain.de";
hier wird nur der erste Link geändert, wie nicht der zweite?
Ganz einfach, der zweite Link hat kein Leerzeichen am Ende. Der Suchausdruck passt also nicht und die Substitution wird nicht durchgeführt.
Mach am Ende des Strings nach de ein Leerzeichen, dann funktioniert es.
Oder ohne Leerzeichen mit meiner ursprüngliche Variante (aber dann mit /g;).
Ohne Kenntnis aller Links in einem Text wird die Erstellung eines umfassend funktionierenden regulären Ausdrucks nur schwer möglich sein, das heißt, man muss ein auf alle Fälle passendes Muster finden.
Grüße
saltun
Ok, jetzt hab ich auch gemerkt, das da mehr reingelade wird, frage meinerseitz wieso??? eigentlich sollte doch bei dem Leerzeichen aufhören *grübel*
String nicht notwendig, hat aber den Sinn, Perl dazu zu bringen, beim ersten .de aufzuhören.
Was machst du bei anderen Addressen oder wenn es hinter der Addresse mit ?typ=0&test=blub weitergeht?