Ich verwende die folgende Funktion, um URLs in einem bestimmten Text abzugleichen und sie durch HTML-Links zu ersetzen. Der reguläre Ausdruck funktioniert hervorragend, aber derzeit ersetze ich nur das erste Spiel.
Wie kann ich die gesamte URL ersetzen? Ich denke, ich sollte den Befehl exec verwenden , aber ich habe nicht wirklich herausgefunden, wie es geht.
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
return text.replace(exp,"<a href='$1'>$1</a>");
}
quelle
URL regexp from Component
nicht kommentiert wird. Eine Erklärung dessen, was es tut, wäre hilfreich.Autolinker.js
ist sehr gut kommentiert und hat Tests. Dieurlize.js
Bibliothek, auf die in der Antwort von Vebjorn Ljosa verwiesen wird, sieht ebenfalls gut aus und ist gut gepflegt, obwohl sie keine Tests enthält.URLs durch Links ersetzen (Antwort auf das allgemeine Problem)
Der reguläre Ausdruck in der Frage übersieht viele Randfälle. Beim Erkennen von URLs ist es immer besser, eine spezialisierte Bibliothek zu verwenden, die internationale Domainnamen, neue TLDs wie
.museum
Klammern und andere Satzzeichen innerhalb und am Ende der URL sowie viele andere Randfälle verarbeitet. Im Blog-Beitrag von Jeff Atwood The Problem With URLs finden Sie eine Erläuterung einiger anderer Probleme."Lassen Sie einen regulären Ausdruck mehr als eine Übereinstimmung ersetzen" (Antwort auf das spezifische Problem)
Fügen Sie am Ende des regulären Ausdrucks ein "g" hinzu, um den globalen Abgleich zu ermöglichen:
Dies behebt jedoch nur das Problem in der Frage, bei der der reguläre Ausdruck nur die erste Übereinstimmung ersetzte. Verwenden Sie diesen Code nicht.
quelle
Ich habe einige kleine Änderungen an Travis 'Code vorgenommen (nur um unnötige Neuerklärungen zu vermeiden - aber es funktioniert hervorragend für meine Bedürfnisse, also gute Arbeit!):
quelle
[a-zA-Z]{2,6}
sollte etwas in der Art von lesen,(?:[a-zA-Z]{2,6})+
um kompliziertere Domain-Namen zu finden, dh [email protected].http://
oderwww
? Funktioniert dies für diese Art von URLs?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
Damit istreplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
das Mailto-ProblemTravis '
Linkify()
Code wurde oben optimiert . Ich habe auch einen Fehler behoben, bei dem E-Mail-Adressen mit Subdomain-Formaten nicht übereinstimmten (z. B. [email protected]).Außerdem habe ich die Implementierung geändert, um die
String
Klasse als Prototyp zu erstellen, sodass Elemente wie folgt abgeglichen werden können:Wie auch immer, hier ist das Drehbuch:
quelle
+
E-Mail-Benutzernamen wie[email protected]
. Ich habe es mit einem E-Mail-Muster behoben/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(beachten Sie das+
in den ersten Klammern), aber ich weiß nicht, ob das etwas anderes kaputt macht.Danke, das war sehr hilfreich. Ich wollte auch etwas, das Dinge verknüpft, die wie eine URL aussehen - als Grundvoraussetzung würde es etwas wie www.yahoo.com verknüpfen, selbst wenn das Protokollpräfix http: // nicht vorhanden wäre. Also im Grunde, wenn "www". vorhanden ist, wird es verlinken und davon ausgehen, dass es http: // ist. Ich wollte auch, dass aus E-Mails Mailto: Links werden. BEISPIEL: www.yahoo.com würde in www.yahoo.com konvertiert
Hier ist der Code, den ich erhalten habe (Kombination aus Code von dieser Seite und anderen Dingen, die ich online gefunden habe, und anderen Dingen, die ich selbst gemacht habe):
Beim zweiten Ersetzen ersetzt der Teil (^ | [^ /]) nur www.whatever.com, wenn ihm nicht bereits // - vorangestellt ist, um Doppelverknüpfungen zu vermeiden, wenn beim ersten Ersetzen bereits eine URL verknüpft wurde. Es ist auch möglich, dass sich www.whatever.com am Anfang der Zeichenfolge befindet. Dies ist die erste "oder" Bedingung in diesem Teil der Regex.
Dies könnte als jQuery-Plugin integriert werden, wie oben von Jesse P dargestellt - aber ich wollte speziell eine reguläre Funktion, die nicht auf ein vorhandenes DOM-Element einwirkt, da ich den vorhandenen Text nehme und ihn dann dem DOM hinzufüge Ich möchte, dass der Text "verknüpft" wird, bevor ich ihn hinzufüge, also übergebe ich den Text durch diese Funktion. Funktioniert super.
quelle
Das Identifizieren von URLs ist schwierig, da sie häufig von Satzzeichen umgeben sind und Benutzer häufig nicht die vollständige Form der URL verwenden. Es gibt viele JavaScript-Funktionen zum Ersetzen von URLs durch Hyperlinks, aber ich konnte keine finden, die genauso gut funktioniert wie der
urlize
Filter im Python-basierten Webframework Django. Ich habe daher Djangosurlize
Funktion auf JavaScript portiert :Ein Beispiel:
Wenn das zweite Argument wahr ist, wird
rel="nofollow"
es eingefügt. Das dritte Argument, falls zutreffend, entgeht Zeichen, die in HTML eine besondere Bedeutung haben. Siehe die README-Datei .quelle
django_compatible
auf false setzen, wird dieser Anwendungsfall etwas besser behandelt.urlize
unterstützt TLDs nicht richtig (zumindest nicht den JS-Port auf GitHub). Eine Bibliothek, die TLDs ordnungsgemäß verarbeitet, ist JavaScript Linkify von Ben Alman .Ich habe eine Änderung an Roshambo String.linkify () an emailAddressPattern vorgenommen, um aaa.bbb. @ Ccc.ddd-Adressen zu erkennen
quelle
Ich habe auf Google nach etwas Neuerem gesucht und bin auf Folgendes gestoßen:
Demo: http://jsfiddle.net/kachibito/hEgvc/1/
Funktioniert sehr gut für normale Links.
quelle
http://example.com/folder/folder/folder/
oder so gemeinthttps://example.org/blah
- nur das typische nicht verrückte URL-Format, das 95-99% der Anwendungsfälle entspricht. Ich verwende dies für einen internen Verwaltungsbereich, daher brauche ich nichts Besonderes, um Edge-Cases oder Hash-Links abzufangen.Das beste Skript dafür: http://benalman.com/projects/javascript-linkify-process-lin/
quelle
Diese Lösung funktioniert wie viele andere und verwendet tatsächlich denselben regulären Ausdruck wie einer von ihnen. Anstatt jedoch einen HTML-String zurückzugeben, wird ein Dokumentfragment zurückgegeben, das das A-Element und alle anwendbaren Textknoten enthält.
Es gibt einige Einschränkungen, insbesondere bei älterer IE- und textContent-Unterstützung.
Hier ist eine Demo.
quelle
Wenn Sie einen kürzeren Link (nur Domain), aber dieselbe lange URL anzeigen müssen, können Sie meine Änderung der oben angegebenen Codeversion von Sam Hasler ausprobieren
quelle
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
Unten sind einige getestete Zeichenfolgen aufgeführt:
Hinweis: Wenn Sie nicht
www
als gültig übergeben möchten, verwenden Sie einfach unten reg ex:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
quelle
Die Warnungen zur URI-Komplexität sollten beachtet werden. Die einfache Antwort auf Ihre Frage lautet jedoch:
Um jede Übereinstimmung zu ersetzen, müssen Sie das
/g
Flag am Ende des RegEx hinzufügen :/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
quelle
einfaches Beispiel
quelle
Halte es einfach! Sagen Sie, was Sie nicht haben können, anstatt was Sie haben können :)
Wie oben erwähnt, können URLs sehr komplex sein, insbesondere nach dem "?", Und nicht alle beginnen mit einem "www". z.B
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Also, anstatt einen komplexen regulären Ausdruck zu haben, der nicht alle Randfälle erfüllt und schwer zu pflegen ist, wie wäre es mit diesem viel einfacheren, der für mich in der Praxis gut funktioniert.
Spiel
http(s):// (anything but a space)+
www. (anything but a space)+
Wo 'irgendetwas' ist
[^'"<>\s]
... im Grunde genommen ein gieriges Match, bei dem Sie ein Leerzeichen, ein Zitat, eine spitze Klammer oder ein Zeilenende treffenEbenfalls:
Denken Sie daran, zu überprüfen, ob es nicht bereits im URL-Format vorliegt, z. B. enthält der Text
href="..."
odersrc="..."
Fügen Sie ref = nofollow hinzu (falls zutreffend)
Diese Lösung ist nicht so "gut" wie die oben genannten Bibliotheken, aber viel einfacher und funktioniert in der Praxis gut.
quelle
Die korrekte URL-Erkennung mit Unterstützung für internationale Domains und Astralzeichen ist keine triviale Sache.
linkify-it
Die Bibliothek erstellt Regex unter vielen Bedingungen und die endgültige Größe beträgt ca. 6 Kilobyte :). Es ist genauer als alle Bibliotheken, auf die derzeit in der akzeptierten Antwort verwiesen wird.In der Linkify-It-Demo können Sie alle Edge-Fälle live überprüfen und Ihre testen.
Wenn Sie eine HTML-Quelle verknüpfen müssen, sollten Sie sie zuerst analysieren und jedes Text-Token separat durchlaufen.
quelle
Ich habe noch eine weitere JavaScript-Bibliothek geschrieben, die möglicherweise besser für Sie ist, da sie sehr empfindlich ist und die geringstmöglichen Fehlalarme aufweist, schnell und klein ist. Ich pflege es derzeit aktiv. Bitte testen Sie es auf der Demoseite und sehen Sie, wie es für Sie funktionieren würde.
Link: https://github.com/alexcorvi/anchorme.js
quelle
Ich musste das Gegenteil tun und HTML-Links nur in die URL einfügen, aber ich habe Ihren regulären Ausdruck geändert und es funktioniert wie ein Zauber, danke :)
quelle
Die E-Mail-Erkennung in der obigen Antwort von Travitron hat bei mir nicht funktioniert, daher habe ich sie durch Folgendes erweitert / ersetzt (C # -Code).
Dies ermöglicht E-Mail-Adressen wie " [email protected] ".
quelle
Nach Eingaben aus mehreren Quellen habe ich jetzt eine Lösung, die gut funktioniert. Es hatte damit zu tun, einen eigenen Ersatzcode zu schreiben.
Antwort .
Geige .
quelle
Ersetzen Sie URLs im Text durch HTML-Links und ignorieren Sie die URLs in einem href / pre-Tag. https://github.com/JimLiu/auto-link
quelle
Hier ist meine Lösung:
quelle
Versuchen Sie die folgende Funktion:
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
quelle
Versuchen Sie es mit der folgenden Lösung
quelle