Estoy usando la siguiente función para hacer coincidir las URL dentro de un texto determinado y reemplazarlas por enlaces HTML. La expresión regular está funcionando muy bien, pero actualmente solo estoy reemplazando la primera coincidencia.
¿Cómo puedo reemplazar toda la URL? Supongo que debería estar usando el comando exec , pero realmente no pensé cómo hacerlo.
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>");
}
fuente
URL regexp from Component
que no se comente, sería útil alguna explicación de lo que está haciendo.Autolinker.js
se comenta muy bien y tiene pruebas. Laurlize.js
biblioteca vinculada a la respuesta de Vebjorn Ljosa también parece funcional y bien mantenida, aunque no tiene pruebas.Reemplazo de URL con enlaces (Respuesta al problema general)
La expresión regular en la pregunta pierde muchos casos extremos. Al detectar URL, siempre es mejor usar una biblioteca especializada que maneje nombres de dominio internacionales, nuevos TLD
.museum
, paréntesis y otros signos de puntuación dentro y al final de la URL, y muchos otros casos extremos. Consulte la publicación del blog de Jeff Atwood El problema con las URL para obtener una explicación de algunos de los otros problemas."Hacer que una expresión regular reemplace más de una coincidencia" (Respuesta al problema específico)
Agregue una "g" al final de la expresión regular para habilitar la coincidencia global:
Pero eso solo soluciona el problema en la pregunta donde la expresión regular solo reemplazaba la primera coincidencia. No uses ese código.
fuente
He hecho algunas pequeñas modificaciones al código de Travis (solo para evitar cualquier redeclaración innecesaria, pero está funcionando muy bien para mis necesidades, ¡qué buen trabajo!):
fuente
[a-zA-Z]{2,6}
debería leer algo(?:[a-zA-Z]{2,6})+
similar para coincidir con nombres de dominio más complicados, es decir, [email protected]http://
owww
? ¿Funcionará para ese tipo de URL?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
con estoreplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
que soluciona el problema de mailto :)Hice algunas optimizaciones al
Linkify()
código de Travis arriba. También solucioné un error en el que las direcciones de correo electrónico con formatos de tipo de subdominio no coincidían (es decir, [email protected]).Además, cambié la implementación para
String
crear un prototipo de la clase, de modo que los elementos puedan coincidir así:De todos modos, aquí está el guión:
fuente
+
nombres de usuario de correo electrónico, como[email protected]
. Lo arreglé con el patrón de correo electrónico/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(tenga+
en cuenta los primeros corchetes), pero no sé si eso rompe algo más.Gracias, esto fue muy útil. También quería algo que vinculara cosas que parecían una URL; como requisito básico, vincularía algo como www.yahoo.com, incluso si el prefijo de protocolo http: // no estaba presente. Básicamente, si "www". está presente, lo vinculará y asumirá que es http: //. También quería que los correos electrónicos se convirtieran en mailto: enlaces. EJEMPLO: www.yahoo.com se convertiría a www.yahoo.com
Aquí está el código con el que terminé (combinación de código de esta página y otras cosas que encontré en línea, y otras cosas que hice por mi cuenta):
En el segundo reemplazo, la parte (^ | [^ /]) solo reemplaza www.whatever.com si aún no tiene el prefijo // - para evitar la doble vinculación si una URL ya estaba vinculada en el primer reemplazo. Además, es posible que www.whatever.com esté al comienzo de la cadena, que es la primera condición "o" en esa parte de la expresión regular.
Esto podría integrarse como un complemento jQuery como lo ilustra Jesse P arriba, pero específicamente quería una función regular que no actuara en un elemento DOM existente, porque estoy tomando el texto que tengo y luego lo agrego al DOM, y Quiero que el texto se "vincule" antes de agregarlo, así que paso el texto a través de esta función. Funciona genial.
fuente
Identificar las URL es complicado porque a menudo están rodeadas de signos de puntuación y porque los usuarios con frecuencia no usan la forma completa de la URL. Existen muchas funciones de JavaScript para reemplazar las URL con hipervínculos, pero no pude encontrar una que funcione tan bien como el
urlize
filtro en el marco web basado en Python Django. Por lo tanto, porté laurlize
función de Django a JavaScript:Un ejemplo:
El segundo argumento, si es verdadero, hace
rel="nofollow"
que se inserte. El tercer argumento, si es verdadero, escapa a los caracteres que tienen un significado especial en HTML. Ver el archivo README .fuente
django_compatible
en falso, manejará ese caso de uso un poco mejor.urlize
no admite TLD correctamente (al menos no el puerto JS en GitHub). Una biblioteca que maneja los TLD correctamente es JavaScript Linkify de Ben Alman .Realicé un cambio en Roshambo String.linkify () a la dirección de correo electrónico Dirección para reconocer las direcciones aaa.bbb. @ Ccc.ddd
fuente
Busqué en Google algo nuevo y me encontré con este:
demostración: http://jsfiddle.net/kachibito/hEgvc/1/
Funciona muy bien para enlaces normales.
fuente
http://example.com/folder/folder/folder/
ohttps://example.org/blah
etc., solo su típico formato de URL no loco que coincidirá con el 95-99% de los casos de uso. Estoy usando esto para un área administrativa interna, por lo que no necesito nada sofisticado para detectar casos límite o enlaces hash.El mejor script para hacer esto: http://benalman.com/projects/javascript-linkify-process-lin/
fuente
Esta solución funciona como muchas de las otras, y de hecho usa la misma expresión regular que una de ellas, sin embargo, en lugar de devolver una Cadena HTML, devolverá un fragmento de documento que contiene el elemento A y los nodos de texto aplicables.
Hay algunas advertencias, a saber, con soporte para IE y textContent más antiguos.
Aquí hay una demostración.
fuente
Si necesita mostrar un enlace más corto (solo dominio), pero con la misma URL larga, puede probar mi modificación de la versión del código de Sam Hasler publicada anteriormente
fuente
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
A continuación se presentan algunas cadenas probadas:
Nota: Si no desea pasar
www
como válido solo use el siguiente reg ex:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
fuente
Deben tenerse en cuenta las advertencias sobre la complejidad de URI, pero la respuesta simple a su pregunta es:
Para reemplazar cada coincidencia, debe agregar el
/g
indicador al final de RegEx:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
fuente
ejemplo simple
fuente
¡Mantenlo simple! Di lo que no puedes tener, en lugar de lo que puedes tener :)
Como se mencionó anteriormente, las URL pueden ser bastante complejas, especialmente después del '?', Y no todas comienzan con un 'www'. p.ej
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Entonces, en lugar de tener una expresión regular compleja que no cumpla con todos los casos límite, y será difícil de mantener, ¿qué tal este mucho más simple, que funciona bien para mí en la práctica?
Partido
http(s):// (anything but a space)+
www. (anything but a space)+
Donde 'cualquier cosa' es
[^'"<>\s]
... básicamente una coincidencia codiciosa, llevándote a un espacio, una cita, un ángulo o un final de líneaTambién:
Recuerde verificar que aún no esté en formato URL, por ejemplo, el texto contiene
href="..."
osrc="..."
Añadir ref = nofollow (si corresponde)
Esta solución no es tan "buena" como las bibliotecas mencionadas anteriormente, pero es mucho más simple y funciona bien en la práctica.
fuente
La detección correcta de URL con dominios internacionales y soporte de caracteres astrales no es algo trivial.
linkify-it
la biblioteca construye expresiones regulares desde muchas condiciones , y el tamaño final es de aproximadamente 6 kilobytes :). Es más preciso que todas las bibliotecas, actualmente se hace referencia en la respuesta aceptada.Vea la demostración de linkify-it para ver en vivo todos los casos límite y probar los suyos.
Si necesita vincular la fuente HTML, primero debe analizarla e iterar cada token de texto por separado.
fuente
He escrito otra biblioteca de JavaScript, podría ser mejor para usted, ya que es muy sensible con los menos falsos positivos posibles, rápido y de tamaño pequeño. Actualmente lo estoy manteniendo activamente, así que pruébelo en la página de demostración y vea cómo funcionaría para usted.
enlace: https://github.com/alexcorvi/anchorme.js
fuente
Tuve que hacer lo contrario y hacer enlaces html solo en la URL, pero modifiqué su expresión regular y funciona de maravilla, gracias :)
fuente
La detección de correo electrónico en la respuesta de Travitron anterior no funcionó para mí, por lo que la extendí / reemplacé con lo siguiente (código C #).
Esto permite direcciones de correo electrónico como " [email protected] ".
fuente
Después de la entrada de varias fuentes, ahora tengo una solución que funciona bien. Tenía que ver con escribir su propio código de reemplazo.
Respuesta .
Violín .
fuente
Reemplace las URL en el texto con enlaces HTML, ignore las URL dentro de una etiqueta href / pre. https://github.com/JimLiu/auto-link
fuente
Aquí está mi solución:
fuente
Pruebe la siguiente función:
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
fuente
Pruebe a continuación la solución
fuente