La coincidencia de expresiones regulares de URL más corta en JavaScript

16

Cree la expresión regular más corta que coincida aproximadamente con una URL en el texto cuando se ejecuta en JavaScript

Ejemplo:

"some text exampley.com".match(/your regular expression goes here/);

La expresión regular necesita

  • captura todas las URL válidas que son para http y https.
  • no se preocupe por no coincidir con las cadenas de búsqueda de URL que no son URL válidas super.awesome/cool
  • ser válido cuando se ejecuta como una expresión regular de JavaScript

Criterio de prueba:

Partido:

No coincide:

  • ejemplo
  • Super guay
  • Buenos días
  • yo puedo
  • Hola.

Aquí hay una prueba que podría ayudar a aclarar un poco http://jsfiddle.net/MikeGrace/gsJyr/

Pido disculpas por la falta de claridad, no me había dado cuenta de lo horrible que era la coincidencia de URL.

Mike Grace
fuente
Ahgrrrr! ¡Extraño mis privilegios de edición! Si vas a restringir el juego a un idioma, tal vez deberías etiquetarlo con ese idioma.
dmckee
¿Qué constituye un carácter de URL válido? porque simplemente puedo usarlo \wpara todo ¿Espera referencias a diferentes componentes de URL?
Ming-Tang
1
"Un URI es una secuencia de caracteres de un conjunto muy limitado, es decir, las letras del alfabeto latino básico, dígitos y algunos caracteres especiales", según RFC 2396 .
RunnerRick
Mike: Supongo que todavía hay algunas aclaraciones en orden. Tal como está ahora, puedo usarlo /:/como la expresión regular y hacer coincidir los URI válidos y no hacer coincidir todos sus ejemplos en la lista »No coincidir«. Mientras siga esa ruta, es simplemente la pregunta: ¿Cuál es la expresión regular más corta que no coincidirá con ninguna de las cadenas de ejemplo, pero aún capturará todos los URI.
Joey
1
Solo trata de escribir un desafío más largo con más detalles.

Respuestas:

1
/.+\.\w\w.*/

no coincide con 3 cadenas que no debería, coincide con casi cualquier otra cosa;)
upd: todavía no coincide con los 5

www0z0k
fuente
14

Este funciona:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

Pasa las pruebas en http://jsfiddle.net/9BYdp/1/

También coincide con:

  • ejemplo.com. (punto final)
  • ejemplo.com:8080 (puerto)
Arnaud Le Blanc
fuente
¡¡¡¡¡¡¡Dulzura!!!!!!!
Mike Grace
2
¿No le gustaría hacer coincidir un nombre de host con un solo componente también (por ejemplo, localhost)?
RunnerRick
Esto permite espacios
Brenjt
funciona para mi. ty :)
STEEL
Funciona bien, pero no para dominios con partes de usuario / contraseña, por ejemplohttp://user:[email protected]/path
Radon8472
5

Obviamente, esto no hace lo que pretendes, pero cumple con tus criterios:

 /.*/
  • "coincide con todas las URL válidas que son para http y https".

    Sí, definitivamente coincidirá.

  • "no se preocupe por no coincidir con las cadenas de búsqueda de URL que no son URL válidas como 'super.awesome / cool'"

    sí, claro, habrá muchos falsos positivos, pero dijiste que eso no importa.

  • ser válido cuando se ejecuta como una expresión regular de JavaScript

    Seguro que los huevos funcionan como dices.

Si este resultado NO es una respuesta correcta, entonces debe ser más selectivo con sus criterios.

Para ser una regla que funcione como pretendes, en realidad es necesario implementar un emparejador compatible con RFC completo, y un emparejador compatible con RFC completo "se preocupará por no coincidir".

Entonces, en términos de "permiso no coincidente", debe especificar exactamente qué desviaciones de RFC son permisibles.

Cualquier otra cosa, y todo este ejercicio es una farsa, porque la gente simplemente escribirá lo que sea que les funcione, o cómo les guste, y sacrificará "tener sentido" en favor de ser breve (como lo hice yo).

En su actualización

La expresión regular más ingenua que se me ocurre que coincide (y captura) con todos sus ejemplos pegados hasta ahora es:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

Es bastante simple en naturaleza, y asume que solo son posibles 3 formas básicas.

x.y
x.y/
x.y/z 

zpuede ser anthing no espacio en blanco. xpuede ser cualquier cosa, no espacios en blanco. ypuede ser cualquier cosa que no sea un espacio en blanco o un carácter '/'.

Hay muchas cosas que serán válidas para esta regla, muchas, pero al menos se verán como un URI válido para un humano, simplemente no serán compatibles con las especificaciones.

p.ej:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

Creo que el enfoque sensato es extraer cosas que probablemente sean URI, luego validarlas con algo más estricto, estoy buscando resolver cómo usar la clase URI de los navegadores para validarlas =).

Pero puede ver el razonamiento anterior trabajando en este ejemplo aquí: http://jsfiddle.net/mHbXx/

Kent Fredric
fuente
Él cambió la pregunta, pero de todos modos puedes hacerlo mejor /:/incluso después de la edición :-)
Joey
Gracias Mike =). No deseo competir de una manera más seria, las otras sugerencias son más útiles, solo quería señalar el problema con la premisa inicial para que la calidad de la pregunta pudiera mejorar =)
Kent Fredric
¿Soy solo yo o se trata de "www .google .com"?
Schiavini
1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

Trata eso.

Incluyo las barras inclinadas iniciales y finales que delimitan la expresión regular, ¡así que espero que eso no perjudique mi recuento de caracteres!

Este patrón limita el protocolo a http o https, permite un número de puerto opcional y luego permite cualquier carácter excepto los espacios en blanco.

RunnerRick
fuente