¿Alguien tiene sugerencias para detectar URL en un conjunto de cadenas?
arrayOfStrings.forEach(function(string){
// detect URLs in strings and do something swell,
// like creating elements with links.
});
Actualización: Terminé usando esta expresión regular para la detección de enlaces ... Aparentemente, varios años después.
kLINK_DETECTION_REGEX = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi
El asistente completo (con soporte opcional para manillares) está en la esencia # 1654670 .
javascript
regex
url
Arbales
fuente
fuente
Respuestas:
Primero necesitas una buena expresión regular que coincida con las URL. Esto es dificil de hacer. Mira aquí , aquí y aquí :
De todos modos, esta respuesta no está destinada a darle la mejor expresión regular, sino más bien una prueba de cómo hacer que la cadena se ajuste dentro del texto, con JavaScript.
OK, así que usemos este:
/(https?:\/\/[^\s]+)/g
Nuevamente, esta es una mala expresión regular . Tendrá muchos falsos positivos. Sin embargo, es lo suficientemente bueno para este ejemplo.
Entonces, en resumen, intente:
fuente
.replace
: |text="Find me at http://www.example.com, and also at http://stackoverflow.com."
resultados de puntuación finales en dos 404. Algunos usuarios son conscientes de esto y agregarán un espacio después de las URL antes de la puntuación para evitar la rotura, pero la mayoría de los vinculadores que uso (Gmail, etherpad, phabricator) separan la puntuación final de la URL.Esto es lo que terminé usando como mi expresión regular:
Esto no incluye la puntuación final en la URL. La función de Crescent funciona de maravilla :) así que:
fuente
urlRegex
debe definirse afueralinkify
como compilarlo es costoso.()
en cada lista de personajes y funciona ahora.Busqué en Google este problema durante bastante tiempo, luego se me ocurrió que hay un método de Android, android.text.util.Linkify, que utiliza algunas expresiones regulares bastante robustas para lograr esto. Afortunadamente, Android es de código abierto.
Utilizan algunos patrones diferentes para hacer coincidir diferentes tipos de URL. Puedes encontrarlos todos aquí: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex. 0WEB_URL_PATTERN
Si solo le preocupan las URL que coinciden con WEB_URL_PATTERN, es decir, las URL que se ajustan a la especificación RFC 1738, puede usar esto:
Aquí está el texto completo de la fuente:
Si quieres ser realmente elegante, también puedes probar las direcciones de correo electrónico. La expresión regular para las direcciones de correo electrónico es:
PD: Los dominios de nivel superior admitidos por expresiones regulares anteriores están vigentes a partir de junio de 2007. Para obtener una lista actualizada, deberá consultar https://data.iana.org/TLD/tlds-alpha-by-domain.txt .
fuente
a-zA-Z
yhttp|https|Http|Https|rtsp|Rtsp
.Basado en la respuesta Crescent Fresh
si desea detectar enlaces con http: // O sin http: // y por www. puedes usar lo siguiente
fuente
Parece que esta biblioteca en NPM es bastante completa https://www.npmjs.com/package/linkifyjs
fuente
La función también se puede mejorar para representar imágenes:
o para una imagen en miniatura que se vincula a una imagen de tamaño completo:
Y aquí está la función strip () que procesa previamente la cadena de texto para lograr uniformidad al eliminar cualquier html existente.
fuente
Short Code Big Work! ...
Resultado:-
fuente
Hay un paquete npm existente: url-regex , simplemente instálelo con
yarn add url-regex
onpm install url-regex
y úselo de la siguiente manera:fuente
tmp.innerText no está definido. Deberías usar tmp.innerHTML
fuente
prueba esto:
También reconocerá URLs tales como
google.com
,http://www.google.bla
,http://google.bla
,www.google.bla
pero nogoogle.bla
fuente
Puede usar una expresión regular como esta para extraer patrones de URL normales.
Si necesita patrones más sofisticados, use una biblioteca como esta.
https://www.npmjs.com/package/pattern-dreamer
fuente
(?:www\.|(?!www))
? ¿Por qué deberíawwwww.com
ser inválido?Solución orientada a objetos genérica
Para las personas como yo que usan marcos como angular que no permiten manipular DOM directamente, creé una función que toma una cadena y devuelve una matriz de
url
/plainText
objetos que se pueden usar para crear cualquier representación de UI que desee.URL regex
Para la coincidencia de URL usé
h0mayun
regex (ligeramente adaptado) :/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g
Mi función también elimina los caracteres de puntuación desde el final de una URL como
.
y,
creo que con más frecuencia será una puntuación real que un final de URL legítimo (¡pero podría serlo! Esto no es ciencia rigurosa ya que otras respuestas explican bien) Para eso aplico el siguiente expresión regular en URL coincidentes/^(.+?)([.,?!'"]*)$/
.Código mecanografiado
fuente
Si desea detectar enlaces con http: // O sin http: // O ftp u otros casos posibles como eliminar la puntuación final al final, eche un vistazo a este código.
https://jsfiddle.net/AndrewKang/xtfjn8g3/
Una manera simple de usar eso es usar NPM
fuente