2008-10-29 8 views
39

Kennt jemand ein Skript, das alle Textverweise auf URLs auswählen und automatisch durch Anchor-Tags ersetzen kann, die auf diese Orte verweisen?jQuery Text zu verknüpfen Skript?

For example: 

http://www.google.com 

would automatically turn into 

<a href="http://www.google.com">http://www.google.com</a> 

Anmerkung: ich dies wollen, weil ich will sie nicht gehen durch alle meine Inhalte und wickeln mit Anker-Tags.

+0

JavaScript ist die einzige Umgebung zur Verfügung, oder Sie haben einen Server-Backend wie pHP? – DGM

+0

Ich habe eine Bibliothek erstellt, die Sie vielleicht in Erwägung ziehen: ali-saleem.github.io/anchorme.js ist sehr klein, sehr effizient, sehr sensitiv, bietet die geringste Anzahl an Fehlalarmen, unterstützt alle TLDs, unterstützt IPs, FTPs, HTTP oder sogar ohne http, überspringt HTML, ohne Regex und es ist 3 mal schneller als Linkify und Autolinker. –

Antwort

13

JQuery wird Ihnen hier nicht viel helfen, da Sie sich nicht wirklich mit der DOM-Traversierung/Manipulation beschäftigen (abgesehen von der Erstellung des Anchor-Tags). Wenn alle Ihre URLs in < p class = "url" > Tags wären, dann vielleicht.

Eine Vanille-JavaScript-Lösung ist wahrscheinlich, was Sie wollen, und wie das Schicksal es haben würde, this guy should have you covered.

+0

Danke Mann! Guter Punkt ... –

+5

Ich stimme nicht zu, die Lösung dieses Problems beinhaltet viel DOM-Traversing (vielleicht nicht viele CSS-Selektoren) und jQuery ist ein gutes Werkzeug, um dies zu lösen. (Siehe meinen Beispielentwurf für ein jQuery-Plugin unten.) –

4

Ich schlage vor, Sie tun dies auf Ihren statischen Seiten vor dem Rendern im Browser, oder Sie werden die Last der Konvertierung Berechnung auf Ihre armen Besucher schieben. :) Hier ist, wie Sie es in Ruby tun könnte (von stdin zu lesen, zu schreiben stdout):

while line = gets 
    puts line.gsub(/(^|[^"'])(http\S+)/, "\\1<a href='\\2'>\\2</a>") 
end 

Offensichtlich sollten Sie darüber nachdenken, wie diese so robust zu machen, wie Sie es wünschen. Das oben genannte erfordert, dass alle URLs mit http beginnen und prüfen, dass URLs, die in Anführungszeichen gesetzt sind (d. H. Die sich bereits in einem < a href = "..." > befinden), nicht konvertiert werden. Es fängt nicht ftp: //, mailto: ein. Es wird glücklich Material in Orten wie <Skript> Körper konvertieren, die Sie möglicherweise nicht passieren möchten.

Die befriedigendste Lösung ist wirklich, die Konvertierung von Hand mit Ihrem Editor zu machen, so dass Sie alle Substitutionen ansehen und genehmigen können. A good editor können Sie regexp Substitution mit Gruppenreferenzen tun (aka zurück Referenzen), so sollte es keine große Sache sein.

0

Wenn Sie eine Lösung aus einer anderen Perspektive wollen ... Wenn Sie die Seiten über PHP und HTML Purifier ausführen können, kann es die Ausgabe automatisch formatieren und alle URLs verknüpfen.

56

HINWEIS: Eine aktualisierte und korrigierte Version dieses Skript jetzt bei https://github.com/maranomynet/linkify (GPL/MIT-Lizenz) verfügbar ist


Hmm ... mir scheint wie die perfekte Aufgabe für jQuery.

... so etwas wie dies kam die Spitze meiner Meinung ab:

// Define: Linkify plugin 
(function($){ 

    var url1 = /(^|&lt;|\s)(www\..+?\..+?)(\s|&gt;|$)/g, 
     url2 = /(^|&lt;|\s)(((https?|ftp):\/\/|mailto:).+?)(\s|&gt;|$)/g, 

     linkifyThis = function() { 
     var childNodes = this.childNodes, 
      i = childNodes.length; 
     while(i--) 
     { 
      var n = childNodes[i]; 
      if (n.nodeType == 3) { 
      var html = $.trim(n.nodeValue); 
      if (html) 
      { 
       html = html.replace(/&/g, '&amp;') 
         .replace(/</g, '&lt;') 
         .replace(/>/g, '&gt;') 
         .replace(url1, '$1<a href="http://$2">$2</a>$3') 
         .replace(url2, '$1<a href="$2">$2</a>$5'); 
       $(n).after(html).remove(); 
      } 
      } 
      else if (n.nodeType == 1 && !/^(a|button|textarea)$/i.test(n.tagName)) { 
      linkifyThis.call(n); 
      } 
     } 
     }; 

    $.fn.linkify = function() { 
    return this.each(linkifyThis); 
    }; 

})(jQuery); 

// Usage example: 
jQuery('div.textbody').linkify(); 

Es wird versucht, schalten Sie alle Vorkommen der folgenden in Links:

  • www.example.com/path
  • http://www.example.com/path
  • mailto:[email protected]
  • ftp://www.server.com/path
  • ... alle oben genannten in eckigen Klammern (d. H. < ...>)

Genießen :-)

+0

Kleiner Syntaxfehler: while (i--) {// beachten Sie die zusätzliche Klammer Vielen Dank! Dieses Plugin war genau das, wonach ich suchte. –

+0

Fehler behoben, danke! –

+0

BTW, eine aktualisierte und korrigierte Version dieses Skripts ist jetzt verfügbar (GPL/MIT) unter http://github.com/maranomynet/linkify –

1

Dadurch serverseitige keine Option manchmal ist. Denken Sie an einem Client-seitige Twitter-Widget (das direkt an Twitter-API JSONP geht), und Sie wollen dynamisch alle URLs in der Tweets Linkify ...

2

Werfen Sie einen Blick auf dieser JQuery-Plugin: https://code.google.com/p/jquery-linkifier/

+0

Dieses Plugin ist sehr naiv. Es gibt keinen Stand der Technik, obwohl es [Tonnen URL-Analyse- und Validierungsbibliotheken gibt] (http://stackoverflow.com/a/21925491/1269037). –

5

ich habe diese Funktion i nennen

textToLinks: function(text) { 

    var re = /(https?:\/\/(([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?))/g; 
    return text.replace(re, "<a href=\"$1\" title=\"\">$1</a>"); 
    }