¿Hay alguna manera en JavaScript para verificar si una cadena es una URL?
Las RegExes están excluidas porque la URL probablemente está escrita como stackoverflow
; es decir que podría no tener un .com
, www
o http
.
javascript
string
url
Bruno
fuente
fuente
http
, por defecto no hay url.<scheme>:<scheme-specific-part>
href
elemento de anclaje, funciona al llamarwindow.open(url)
, señala algo que realmente existe, funciona en la ubicación del navegador barra, o una combinación de lo anterior? Obtendrá respuestas muy diferentes según cuál de estas le interese.Respuestas:
Una pregunta relacionada con una respuesta:
Javascript regex coincidencia de URL
O este Regexp de Devshed :
fuente
{ title: "Stackoverflow", uri: "http://stackoverflow.com" }
Actualización: de hecho, consulte code.google.com/chrome/extensions/bookmarks.htmlinvalid quantifier
. ¿Alguna idea?SyntaxError: Invalid regular expression: /^(https?://)?((([a-zd]([a-zd-]*[a-zd])*).)+[a-z]{2,}|((d{1,3}.){3}d{1,3}))(:d+)?(/[-a-zd%_.~+]*)*(?[;&a-zd%_.~+=-]*)?(#[-a-zd_]*)?$/: Invalid group
Google Chrome (versión 30.0.1599.101) (Mac OS X: 10.8.5)RegExp
, debe escapar dos veces de las barras invertidas; de lo contrario, obtendrá errores como un grupo no válido .fuente
http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)
Puse una caldera, fui a un inodoro, llamé a mi madre y la cosa se hizo en ningún momento ...true
poraaa
.isURL('12345678901234567890123')
agregue algunos caracteres más y es aún peor.Puede intentar usar el
URL
constructor : si no se lanza, la cadena es una URL válida:El término 'URL' se define en RFC 3886 (como URI); debe comenzar con un nombre de esquema, y el nombre del esquema no está limitado a http / https.
Ejemplos notables:
www.google.com
no es URL válida (esquema faltante)javascript:void(0)
es una URL válida, aunque no una HTTPhttp://..
Es URL válida, con el anfitrión bienestar..
; si se resuelve depende de su DNShttps://google..com
es una URL válida, igual que la anteriorSi desea verificar si una cadena es una URL HTTP válida:
fuente
href
atributo para<a>
. La URL válida debe comenzar con un nombre de esquema , por ejemplohttps://
.isValidUrl("javascript:void(0)")
http://..
Ohttp:///a
En lugar de usar una expresión regular, recomendaría usar un elemento de anclaje.
cuando establece la
href
propiedad de unanchor
, se establecen varias otras propiedades.fuente
Sin embargo, si el valor al que
href
está vinculado no es una URL válida, entonces el valor de esas propiedades auxiliares será la cadena vacía.Editar: como se señala en los comentarios: si se usa una URL no válida, las propiedades de la URL actual pueden ser sustituidas.
Por lo tanto, siempre que no pase la URL de la página actual, puede hacer algo como:
fuente
a.href
no es válida,parser.host
devuelve el nombre de host de la página en la que se encuentra actualmente, no el esperadofalse
.<a href="invalidurl">
, que no vaya a su dominio. Se agrega al final de la url actual. Entonces Chrome está haciendo lo correcto al darle el nombre de host actual del elemento "analizador".function isValidURL(str)
: mucho mejor que usar regex! ¡Gracias!Estoy usando la siguiente función para validar URL con o sin
http/https
:fuente
https://sdfasdp.ppppppppppp
decir, regresar,true
pero la mía regresa, lofalse
que se espera, creo.[email protected]
... ¿debería? Supongo que no deberíaPara validar la URL usando javascript se muestra a continuación
fuente
(http|https)
a(?:https?)
; b):{0,1}
a:?
; c)[0-9]
a\d
Confíe en una biblioteca: https://www.npmjs.com/package/valid-url
fuente
{
en la urlMejora en la respuesta aceptada ...
Permite el símbolo @ en la ruta, por ejemplo, https://medium.com/@techytimo
fuente
Aquí hay otro método más.
fuente
new URL(string)
el código de Pavlo. Ambas pruebas tienen resultados idénticos con todos los casos límite que probé. Me gusta su código porque es más simple y no implica la creación de elementos, pero el tuyo es varias veces más rápido (probablemente porque no crea el el después del primer uso).(No tengo representantes para comentar sobre el ejemplo de ValidURL ; por lo tanto, publique esto como respuesta).
Aunque no se recomienda el uso de protocolos URL relativas ( La dirección URL relativa al protocolo ), lo hacen llegar emplean a veces. Para validar dicha URL con una expresión regular, la parte del protocolo podría ser opcional, por ejemplo:
Sin embargo, como otros señalaron, la expresión regular no parece ser el enfoque más adecuado para validar URL.
fuente
isValidURL("https://[email protected]/13176")
@
. No cuelga en mis navegadores .Puede usar la API nativa de URL :
fuente
Como se ha señalado, la expresión regular perfecta es difícil de alcanzar pero parece ser un enfoque razonable (las alternativas son pruebas del lado del servidor o la nueva API de URL experimental ). Sin embargo, las respuestas de alto rango a menudo devuelven falsas para las URL comunes, pero aún peor congelarán su aplicación / página durante minutos en una cadena tan simple como
isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. Se ha señalado en algunos de los comentarios, pero lo más probable es que no haya ingresado un valor malo para verlo. Colgar así hace que ese código sea inutilizable en cualquier aplicación seria. Creo que se debe a los conjuntos de mayúsculas y minúsculas repetidas en código como((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Saque la 'i' y no se cuelga, pero por supuesto no funcionará como se desea. Pero incluso con el indicador de ignorar mayúsculas y minúsculas, esas pruebas rechazan valores altos de Unicode que están permitidos.Lo mejor ya mencionado es:
Eso viene de Github segmento / is-url . Lo bueno de un repositorio de código es que puede ver las pruebas y cualquier problema y también las cadenas de prueba que se ejecutan a través de él. Hay una rama que permitiría que falten cadenas como el protocolo
google.com
, aunque probablemente estés haciendo demasiados supuestos en ese momento. El repositorio se ha actualizado y no planeo tratar de mantener un espejo aquí. Se ha dividido en pruebas separadas para evitar rehacer RegEx que pueden explotarse para ataques DOS (no creo que tenga que preocuparse por eso con el lado del cliente js, pero sí tiene que preocuparse de que su página se cuelgue durante tanto tiempo que su el visitante abandona tu sitio).Hay otro repositorio que he visto que puede ser incluso mejor para isURL en dperini / regex-weburl.js , pero es muy complejo. Tiene una lista de prueba más grande de URL válidas e inválidas. El simple anterior todavía pasa todos los positivos y solo falla al bloquear algunos negativos negativos
http://a.b--c.de/
, así como los ips especiales.Cualquiera que elija, ejecútelo a través de esta función que he adaptado de las pruebas en dperini / regex-weburl.js, mientras utiliza el inpector Herramientas de desarrollo de su navegador.
Y luego prueba esa cadena de 'a's.
Consulte esta comparación de expresiones regulares isURL de Mathias Bynens para obtener más información antes de publicar una expresión regular aparentemente excelente.
fuente
isURL('a'.repeat(100))
millones de veces / segundo (la más compleja de dperini es en realidad más rápida). Algunas de las respuestas de alto rango del formulario ([a-zA-Z] +) * tardarían horas en completarse una vez. Busque redo RegEx para más información.No puedo comentar sobre la publicación que es la más cercana # 5717133 , pero a continuación es la forma en que descubrí cómo hacer que @ tom-gullen regex funcione.
fuente
var pattern = new RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
Use validator.js
ES6
No ES6
También puede ajustar el comportamiento de esta función pasando un
options
objeto opcional como el segundo argumento deisURL
Aquí está el
options
objeto predeterminado :host_whitelist
yhost_blacklist
pueden ser matrices de hosts. También admiten expresiones regulares.fuente
Una función que he estado usando para validar una "cadena" de URL es:
Esta función devolverá un valor booleano si la cadena es una URL.
Ejemplos:
fuente
Esto es bastante difícil de hacer con regex puro porque las URL tienen muchos 'inconvenientes'.
Por ejemplo, los nombres de dominio tienen restricciones complicadas en guiones:
a. Se permite tener muchos guiones consecutivos en el medio.
si. pero el primer carácter y el último carácter del nombre de dominio no pueden ser un guión
C. Los caracteres tercero y cuarto no pueden ser ambos guiones
Del mismo modo, el número de puerto solo puede estar en el rango 1-65535. Esto es fácil de verificar si extrae la parte del puerto y la convierte,
int
pero es bastante difícil de verificar con una expresión regular.Tampoco hay una manera fácil de verificar extensiones de dominio válidas. Algunos países tienen dominios de segundo nivel (como 'co.uk'), o la extensión puede ser una palabra larga como '.international'. Y se agregan nuevos TLD regularmente. Este tipo de cosas solo se pueden verificar con una lista codificada. (ver https://en.wikipedia.org/wiki/Top-level_domain )
Luego están las direcciones URL de imanes, las direcciones ftp, etc. Todas tienen requisitos diferentes.
Sin embargo, aquí hay una función que maneja casi todo excepto:
fuente
Creo que usar la API de URL nativa es mejor que los patrones complejos de expresiones regulares como sugirió @pavlo. Sin embargo, tiene algunos inconvenientes que podemos solucionar con algún código adicional. Este enfoque falla para la siguiente URL válida.
Podemos agregar el protocolo faltante de antemano para evitarlo. Tampoco detecta la siguiente URL no válida.
Entonces, ¿por qué verificar toda la URL? solo podemos verificar el dominio. Tomé prestada la expresión regular para verificar el dominio desde aquí .
El
hostname
atributo es una cadena vacía parajavascript:void(0)
, por lo que también funciona para eso, y también puede agregar un verificador de dirección IP. Me gustaría seguir con la API nativa, y espero que comience a admitir todo en un futuro próximo.fuente
new URL
no tiene en las pruebas que he hecho. Esto es llamar:http://142.42.1.1 //false
y bloquear cadenas altas de Unicode.La pregunta solicita un método de validación para una URL como
stackoverflow
, sin el protocolo o ningún punto en el nombre de host. Por lo tanto, no se trata de validar sintaxis de URL, sino de verificar si es una URL válida, llamándola realmente.Intenté varios métodos para saber si la url true existe y se puede llamar desde el navegador, pero no encontré ninguna forma de probar con javascript el encabezado de respuesta de la llamada:
click()
método.'GET'
está bien, pero tiene varias limitaciones debido a lasCORS
políticas y no es el caso de usarajax
, ya que la url puede estar fuera del dominio de mi servidor.https
protocolo y produce una excepción al llamar a URL no seguras.Entonces, la mejor solución que se me ocurre es obtener alguna herramienta para realizar
CURL
usando JavaScript intentando algo comocurl -I <url>
. Lamentablemente no encontré ninguno y aparentemente no es posible. Agradeceré cualquier comentario sobre esto.Pero, al final, tengo un servidor ejecutándose
PHP
y, como uso Ajax para casi todas mis solicitudes, escribí una función en el lado del servidor para realizar la solicitud de curl allí y volver al navegador.Con respecto a la url de una sola palabra en la pregunta 'stackoverflow', me llevará a
https://daniserver.com.ar/stackoverflow
donde daniserver.com.ar es mi propio dominio.fuente
foo
y asumir que es http o https o .com o .es o cualquiera de los innumerables sufijos? ¿Sigues tirando el fregadero de la cocina hasta que te vuelves verdadero?Este parece ser uno de los problemas más difíciles en CS;)
Aquí hay otra solución incompleta que funciona lo suficientemente bien para mí y mejor que las otras que he visto aquí. Estoy usando una entrada [type = url] para esto para soportar IE11, de lo contrario sería mucho más simple usar window.URL para realizar la validación en su lugar:
Para aceptar entradas incompletas como "www.midominio.com", también será válido suponiendo que el protocolo es "http" en esos casos y devolverá la URL válida si la dirección es válida. Devuelve falso cuando no es válido.
También admite dominios IPv4, pero no IPv6.
fuente
En mi caso, mi único requisito es que la entrada del usuario no se interpretará como un enlace relativo cuando se coloca en el href de una etiqueta y las respuestas aquí fueron un poco OTT para eso o URL permitidas que no cumplen mis requisitos, por lo que esto es con lo que voy:
Lo mismo podría lograrse con bastante facilidad sin expresiones regulares.
fuente
esta trabajando conmigo
fuente
Si puede cambiar el tipo de entrada, creo que esta solución sería mucho más fácil:
Puede usarlo simplemente
type="url"
en su entrada y verificarlocheckValidity()
en jsP.ej:
your.html
your.js
fuente
Este definitivamente no es el enfoque más efectivo, pero es legible y fácil de adaptar a lo que necesite. Y es más fácil agregar expresiones regulares / complejidad desde aquí. Así que aquí hay un enfoque muy pragmático
PRUEBA:
fuente
Mathias Bynens ha compilado una lista de expresiones regulares de URL conocidas con URL de prueba. Hay pocas razones para escribir una nueva expresión regular; simplemente elija uno existente que más le convenga.
Pero la tabla de comparación para esas expresiones regulares también muestra que es casi imposible hacer la validación de URL con una sola expresión regular. Todas las expresiones regulares en la lista de Bynens producen falsos positivos y falsos negativos.
Le sugiero que use un analizador de URL existente (por ejemplo
new URL('http://www.example.com/')
en JavaScript) y luego aplique las comprobaciones que desea realizar en la forma analizada y normalizada de la URL resp. sus componentes El uso de laURL
interfaz de JavaScript tiene el beneficio adicional de que solo aceptará las URL que el navegador realmente acepte.También debe tener en cuenta que las URL técnicamente incorrectas aún pueden funcionar. Por ejemplo
http://w_w_w.example.com/
,http://www..example.com/
,http://123.example.com/
todos tienen una parte de host no válido, pero todos los navegadores sé que van a tratar de abrirlos sin quejas, y cuando se especifique las direcciones IP de esos nombres no válidos en/etc/hosts/
tales direcciones URL incluso trabajar, pero sólo en su ordenador.Por lo tanto, la pregunta no es tanto si una URL es válida, sino qué URL funcionan y deberían permitirse en un contexto particular.
Si desea realizar la validación de URL, hay muchos detalles y casos extremos que son fáciles de pasar por alto:
http://user:[email protected]/
.http://www.stackoverflow.com.
).[-0-9a-zA-z]
definitivamente ya no es suficiente.co.uk
y muchos otros).Cuál de estas limitaciones y reglas se aplica es una cuestión de requisitos y gustos del proyecto.
Recientemente escribí un validador de URL para una aplicación web que es adecuada para URL proporcionadas por el usuario en foros, redes sociales o similares. Siéntase libre de usarlo como base para su propio:
También he escrito una publicación de blog The Gory Details of URL Validation con información más detallada.
fuente
Cambio la función a Match + y hago un cambio aquí con las barras y su trabajo: (http: // y https) ambos
fuente
Aquí hay una comprobación muy simple para asegurarse de que haya un protocolo válido y que la extensión del dominio debe tener dos o más caracteres.
fuente
Si necesita soporte también
https://localhost:3000
, utilice esta versión modificada de la expresión regular de [Devshed].fuente
Hay un par de pruebas que usan el constructor de URL que no delinean si la entrada es una cadena o un objeto de URL.
fuente
Actualización 2020. Para ampliar las excelentes respuestas de @iamnewton y @Fernando Chavez Herrera, he comenzado a ver que
@
se utilizan en la ruta de las URL.Entonces la expresión regular actualizada es:
Si desea permitirlo en la cadena de consulta y el hash, use:
Dicho esto, no estoy seguro de si hay una regla de documento técnico que no se permita
@
en la cadena de consulta o hash.fuente
Ya hay muchas respuestas, pero aquí hay otra contribución: tomada directamente de la
URL
verificación de validez de polyfill, use uninput
elemento contype="url"
para aprovechar la verificación de validez incorporada en el navegador:Fuente
fuente