2009-06-15 33 views

Respuesta

1
(http:/)?(/[\w.]+)+/? 

coincide con estos, pero tal vez tenías condiciones más estrictas en mente?

2
(http:\/)?(\/[\w\.\-]+)+\/? 

Parecido a Alex's.

+0

hmmm, aparte de su escape más a fondo, me parece que estás a juego 'http :/'todo por sí mismo - ¿seguro que quieres eso * en lugar de mi + allí? –

+0

Este parece ser demasiado codicioso. Terminé con aproximadamente 500k de espacio en blanco. – FlySwat

+0

@Alex Buena llamada. Editado –

2

Eso es complicado porque hay tantos caracteres válidos en las URL (antes de que se codifiquen en url).

Aquí es mi oportunidad:

(http:/|https:/)?(/[^\s"'<>]+)+/? 

También similar a la de Alex. El único problema que encontré con Alex es que no coincide con cosas como signos de libra, guiones, cosas así. Mientras que el mío coincidirá con todo eso.

EDITAR - De hecho, lo único que evita que sea demasiado codicioso es la instrucción de NO coincidir con espacios en blanco, comillas, apóstrofes o chevrones.

+0

Demasiado codicioso: http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> FlySwat

+0

Oh ... gotcha. Acabo de actualizarlo. Quizás sea mejor. –

+0

Todavía demasiado codicioso, tira del '/ a' del final' 'si era un enlace HTML – philfreo

8
(
    ((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1} // Capture domain names or IP addresses 
    (/[\w~,;\-\./?%&+#=]*)    // Capture paths, including relative 
) 

Justificación de esta respuesta:

  1. se agrupa toda la cosa para que pueda seleccionar la dirección URL completa
  2. La parte de protocolo es opcional, pero si se proporciona, un nombre de host o IP deben también se proporcionará (ambos tienen menos caracteres permitidos que el resto del URI).
  3. El "/" al principio también es opcional. Las rutas pueden estar en la forma "images/1.gif", que son relativas a la ruta actual en lugar de relativa al nombre de host.

Advertencias:

  1. mailto URI y archivos no compatibles.
  2. Las URL rastreadas por un período (como al final de una frase sin presupuesto) incluirán el período posterior.
  3. Debido al # 3 anterior, capturará todo tipo de cosas. Si puede verificar que todas las rutas sean no relativas a, puede agregar una "/" fuera del paréntesis y así lo requiere.
  4. Si todos los URI están dentro de los atributos HTML (A, LINK, IMG, etc.), puede orientar los URI de forma mucho más precisa capturando solo entre comillas, o al menos solo dentro de las etiquetas HTML.

Edit: whoops, problema de cierre de paren de cierre.

+0

Comprueba tu expresión, incluso después de eliminar los comentarios que no compilará. – FlySwat

+1

Al final falta un paréntesis. Debería ser ... (((http | https | ftp): // ([\ w- \ d] + \.) + [\ w- \ d] +) {0,1} (/ [\ w ~,; \ - \ ./ ?% & + # =] *)) Por cierto, esto fue verificado en http://regexhero.net/ - un gran ahorro de tiempo. –

+0

Tenga en cuenta que esto falla si las URL están en HTML, ya que ' \ a' desde el final '' están incluidos. – philfreo

0

No es fácil y puede que al final tener "demasiada URI" atrapado, sin embargo, ¿qué pasa con:

((http://|https://)([^/])+)*(/([^\s])*(/))(((\w)*\.[\w]{3,10})|(\w+))? 

Básicamente, usted tiene un par de grupos allí. En la definición del protocolo. Uno está buscando el directorio y uno está buscando un archivo al final. ¡Pero! este enfoque es muy limitado. Si necesita una validación de URI real y! separación (puerto, nombre de usuario, contraseña, ¡elimine los caracteres no deseados!) probablemente terminará con una expresión mucho más compleja. ¡Buena suerte!

Actualización:

Usted no pedirá para esto, sin embargo, para los chicos que vienen de los motores de búsqueda que quieran aprender más acerca de expresiones regulares me gustaría poder conectar este programa gratuito que utilicé para este intento "The Regex Coach" (No, no está afiliado).

+0

Esto parece ser el más cercano en realidad coincidir con lo que quiero, sin embargo, lo que es "capturado" suele ser ju st "/" y no todo el URI. – FlySwat

+0

Porque incluso www.google.com, cool.com o www.test.us/test pueden verse como un URI válido desde cierta perspectiva, sugiero la siguiente expresión: ([^ \ s] + [/.] + [^\ s] +) Fracasará en oraciones de compilación regulares siempre que haya un espacio en blanco después. – merkuro

+0

No ... devuelve: '/ foo/bar"> baz philfreo

0

Utilicé grupos de captura de nombres. Obtenemos mejores coincidencias cuando el esquema está presente. Al igual que www.foo.com/bar solo coincidiría/bar.

(?: 
    (?:(?<scheme>https?|file)://) 
    (?<host>[^/]+) 
    (?<path>/(?:[^\s])+)? 
) 
| 
(?<path>/(?:[^\s])+) 

Esto es lo que podría hacer para Javascript

var result = text.match(/(?:(?:(https?|file):\/\/)([^\/]+)(\/(?:[^\s])+)?)|(\/(?:[^\s])+)/g); 

Los datos de prueba

sadfasdf /foo/bar/ba090z.gif asdfasdf /foo/bar/ sadfasdf asdflkj; http://www.foo.com/foo/bar some stuff http://user:[email protected]:80/r?stuff%20stuff 

user:[email protected]:80/r?stuff%20stuff 
Cuestiones relacionadas