Liberal URL expresiones regulares de ayuda de Hacking Gruber
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
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]))
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'
.