Pregunta

Me he tomado la liberal URL Regex de Daring Fireball , fusionado con algunas de las mejoras Alan Storm y cortado a mi manera en la fijación de algunos errores como soporte para caracteres IDN entre paréntesis. Esto es lo que tengo:

/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/

Sin embargo, me he encontrado un error que no estoy siendo capaz de resolver:

'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'

La dirección de arriba está siendo reconocida como www.dsd(sd)sdsd.com' (o www.dsd.com/whatever(whatever)') en lugar de www.dsd(sd)sdsd.com (o www.dsd.com/whatever(whatever)). Esto sólo parece ocurrir cuando la URL tiene paréntesis, ya que la siguiente URL:

'www.sampleurl.com'

Está correctamente ser reconocido como www.sampleurl.com.

Creo no está siendo ejecutada la parte [^[:punct:]\s]|\/ de la expresión regular cuando la URL tiene paréntesis , he estado tratando durante algún tiempo, pero me parece que no puede encontrar una solución. ¿Puede alguien ayudarme?

Para los productos básicos, He configurado un Rubular enlace permanente con la expresión regular y algunos datos de prueba (la última URL falla).


Creo que la expresión regular de Gruber fue un poco apresurado, por ejemplo, que no coincide con la URL del tipo:

http://en.wikipedia.org/wiki/Something_(Special)_For_You

Estoy aún más impresionados al ver que tanto Gruber y Alan perdió esta muy simple errata:

\([\w\d]+\)

No sería \(\w+\) será suficiente? : S

¿Fue útil?

Solución

Gruber ha revisado su expresión regular :

\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))

funciona bien ahora .

Otros consejos

www.dsd (sd) sdsd.com no es un nombre de dominio válido.

Si había 'www.dsd.com/whatever(whatever)', que sería reconocido correctamente. (O al menos es en mis pruebas)

 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

Así es como yo creo que esto se rompe ... el bit de la expresión regular anterior (sd) comienza con un paréntesis de apertura salvo, un char quedó mirando sd coincidencia de la clase, a continuación, un escapado paren de cierre, y el siguiente paso es [^\s()<>]* que coincide sdsd.com' .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top