jQuery Text to Link Script?

Elijah Manor picture Elijah Manor · Oct 29, 2008 · Viewed 41.6k times · Source

Does anyone know of a script that can select all text references to URLs and automatically replace them with anchor tags pointing to those locations?

For example:

http://www.google.com 

would automatically turn into

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

Note: I am wanting this because I don't want to go through all my content and wrap them with anchor tags.

Answer

M&#225;r &#214;rlygsson picture Már Örlygsson · Oct 30, 2008

NOTE: An updated and corrected version of this script is now available at https://github.com/maranomynet/linkify (GPL/MIT licence)


Hmm... to me this seems like the perfect task for jQuery.

...something like this came off the top of my mind:

// 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();

It attempts to turn all occurrences of the following into links:

  • www.example.com/path
  • http://www.example.com/path
  • mailto:[email protected]
  • ftp://www.server.com/path
  • ...all of the above wrapped in angle brackets (i.e. <...>)

Enjoy :-)