2009-07-10 15 views
3

Wie kann ich Text in einen Link konvertieren? Zurück in PHP, habe ich dieses Stück Code, das gut für meinen Zweck gearbeitet:Ersetzen Sie URL mit einem Link mit Regex in Python

  $text = preg_replace("#(^|[\n ])(([\w]+?://[\w\#$%&~.\-;:=,[email protected]\[\]+]*)(/[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)?)#is", "\\1<a href=\"\\2\" target=\"_blank\">\\3</a>", $text); 
      $text = preg_replace("#(^|[\n ])(((www|ftp)\.[\w\#$%&~.\-;:=,[email protected]\[\]+]*)(/[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)?)#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\3</a>", $text); 

Ich habe versucht, um in Python, konnte sie aber nicht bekommen zu arbeiten .. Wäre sehr nett, wenn jemand diese übersetzen könnte zu Python :) ..

+2

Was hat nicht funktioniert? Welche Art von Ergebnissen hast du bekommen? Sie sollten uns einen Hinweis geben, was Sie versucht haben. Sie werden wahrscheinlich bessere Ergebnisse erzielen, die uns einen Ausgangspunkt geben, vor allem, weil es zeigt, dass Sie bereit sind, Arbeit in das Problem zu stecken. –

+2

Wenn du es in Django machst, gibt es den Filter 'urlize': http://docs.djangoproject.com/en/dev/ref/templates/builtins/#urlize – Javier

+0

Aufbauend auf Javier's Kommentar scheint die Quelle urlize zu sein sein, was Sie wollen: http://code.djangoproject.com/browser/django/trunk/django/utils/html.py#L77 – hao

Antwort

5

Der folgende Code ist eine einfache Übersetzung zu Python. Sie sollten bestätigen, dass es tatsächlich das tut, was Sie wollen. Weitere Informationen finden Sie unter Python Regular Expression HOWTO.

import re 

pat1 = re.compile(r"(^|[\n ])(([\w]+?://[\w\#$%&~.\-;:=,[email protected]\[\]+]*)(/[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)?)", re.IGNORECASE | re.DOTALL) 

pat2 = re.compile(r"#(^|[\n ])(((www|ftp)\.[\w\#$%&~.\-;:=,[email protected]\[\]+]*)(/[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)?)", re.IGNORECASE | re.DOTALL) 


urlstr = 'http://www.example.com/foo/bar.html' 

urlstr = pat1.sub(r'\1<a href="\2" target="_blank">\3</a>', urlstr) 
urlstr = pat2.sub(r'\1<a href="http:/\2" target="_blank">\3</a>', urlstr) 

print urlstr 

Hier ist, was die Ausgabe an meinem Ende wie folgt aussieht:

<a href="http://www.example.com/foo/bar.html" target="_blank">http://www.example.com</a> 
+1

Das ist es, es funktioniert. Ich musste nur das Hash-Zeichen pat2 = re.compile (r "# << --- und in urlstr = pat2() entfernen, ich verwendete http: // - nicht nur http:/ Es sieht so aus, als ob ich es vor mir selbst probiert hätte, aber ich wusste nicht, dass "re.IGNORECASE | re.DOTALL" und nicht die Hash-Zeichen, die in meinem PHP-Ausdruck waren. Ich weiß, ich sollte einen Blick auf einige Regex werfen Buch oder Handbuch, aber in all den Jahren brauchte ich nur Regex, um diese "einfache" Sache zu machen, deshalb ist meine Motivation wirklich niedrig. Entschuldigung dafür, hoffe, dass du mich nicht töten wirst:) ... – user122750

+0

Auch ich Ich habe vergessen zu erwähnen, dass ich es auf diese Weise mache und den Filter nicht verwende, weil hier nur der Name der Domain vom Link zum Benutzer angezeigt wird, nicht die vollständige URL und nicht eine auf eine bestimmte Anzahl von Zeichen reduzierte URL. – user122750