2010-01-08 9 views
10

He tomado el Liberal URL Regex from Daring Fireball, lo he fusionado con some of Alan Storm improvements y he pirateado mi camino para solucionar algunos errores, como el soporte para caracteres IDN entre paréntesis. Esto es lo que tengo:Ayuda Hacking Gruber's Liberal URL Regex

/(?:[\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 URL anterior está siendo reconocido 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' 

correctamente está siendo 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. ¿Alguien puede ayudarme?

Para los productos básicos, he creado un Rubular permalink with the regex and some test data (la última URL falla).


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

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

estoy aún más impresionado al ver que tanto Gruber y Alan perdidas esto realmente simple error tipográfico:

\([\w\d]+\) 

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

Respuesta

1

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

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

+0

tampoco parece trabajar (http://www.rubular.com/regexes/12851). –

+0

Hm, cierto. Probé usando la expresión original de Daring Fireball (que uso yo mismo). No soy un experto en expresiones regulares, por lo que espera de cualquier otra solución, me quite mejoras de Alan Storm (porque creo que son inútiles/innecesaria) –

+0

La expresión Daring Fireball única partidos 0-9a-Z entre paréntesis. –

1
/(?:[\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 escapado, a continuación, una clase de carbón se quedó mirando a juego sd, a continuación, una escapó cerrando paren, y el siguiente es [^\s()<>]* que coincide con sdsd.com'.

Cuestiones relacionadas