2008-10-29 11 views
39

¿Alguien sabe de un script que puede seleccionar todas las referencias de texto a las URL y reemplazarlas automáticamente con etiquetas de anclaje que apuntan a esas ubicaciones?jQuery Text to Link Script?

For example: 

http://www.google.com 

would automatically turn into 

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

Nota: Estoy queriendo esto porque no quiero pasar por todo el contenido de mi y se envuelven con las etiquetas de anclaje.

+0

tiene javascript el único entorno disponibles para usted, o usted tiene un motor de servidor como PHP? – DGM

+0

Creé una biblioteca que podría considerar: ali-saleem.github.io/anchorme.js es muy pequeña, muy eficiente, muy sensible, ofrece la menor cantidad de falsos positivos, admite todos los TLD, admite direcciones IP, FTP, HTTP o incluso sin http, omite HTML, sin regex y es 3 veces más rápido que linkify y autolinker. –

Respuesta

13

JQuery no te va a ayudar mucho aquí, ya que no estás realmente interesado en la manipulación/cruce DOM (aparte de crear la etiqueta de anclaje). Si todas sus URL estaban en < p class = "url" > etiquetas, entonces tal vez.

Una solución de JavaScript vainilla es probablemente lo que quiere, y como el destino lo tiene, this guy should have you covered.

+0

Gracias hombre! Buen punto ... –

+5

No estoy de acuerdo, resolver este problema implica una gran cantidad de DOM que atraviesa (tal vez no muchos selectores de CSS) y jQuery es una buena herramienta para resolver esto. (Consulte mi borrador de ejemplo para un complemento jQuery a continuación.) –

4

Te sugiero que hagas esto en tus páginas estáticas antes de renderizar en el navegador, o estarás cargando la carga del cálculo de conversión a tus visitantes pobres. :) He aquí cómo usted puede hacerlo en Ruby (lectura de la entrada estándar, escribiendo en la salida estándar):

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

Obviamente, usted querrá pensar acerca de cómo hacer esto tan robusta como se desee. Lo anterior requiere que todas las URL comiencen con http y verificará que no se conviertan las URL entre comillas (es decir, que ya estén dentro de < a href = "..." >). No detectará ftp: //, mailto :. Con gusto convertirá el material en lugares como <script> cuerpos, que es posible que no desee que suceda.

La solución más satisfactoria es realmente hacer la conversión a mano con su editor para que pueda mirar y aprobar todas las sustituciones. A good editor le permitirá hacer la sustitución de regexp con referencias de grupo (también conocidas como referencias anteriores), por lo que no debería ser un gran problema.

0

Si desea una solución desde otra perspectiva ... si puede ejecutar las páginas a través de php y HTML Purifier, puede autoformato la salida y vincular las URL.

56

NOTA: una versión actualizada y corregida de este guión ya está disponible en https://github.com/maranomynet/linkify (licencia GPL/MIT)


Hmm ... me esto parece la tarea perfecta para jQuery.

... algo como esto salió de la parte superior de la cabeza:

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

Se intenta convertir todas las apariciones de la siguiente en enlaces:

  • www.example.com/path
  • http://www.example.com/path
  • mailto:[email protected]
  • ftp://www.server.com/path
  • ... todo lo anterior está envuelto en corchetes angulares (es decir < ...>)

Enjoy :-)

+0

Error de sintaxis menor: while (i--) {// tenga en cuenta el soporte adicional ¡Gracias! Ese complemento era exactamente lo que estaba buscando. –

+0

Se arregló el error, ¡gracias! –

+0

BTW, ahora está disponible una versión actualizada y corregida de este script (GPL/MIT) en http://github.com/maranomynet/linkify –

1

Hacer esto del lado del servidor no es una opción veces. Piense en un widget del lado del cliente de Twitter (que va directamente a la API de Twitter usando jsonp), y que desea Linkify todas las URLs de los Tweets de forma dinámica ...

2

Tome un vistazo a este plugin jQuery: https://code.google.com/p/jquery-linkifier/

+0

Ese complemento es muy ingenuo. No menciona el estado de la técnica, a pesar de que hay [toneladas de análisis de URL y bibliotecas de validación por ahí] (http://stackoverflow.com/a/21925491/1269037). –

5

tengo esta función que llamo

textToLinks: function(text) { 

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