2010-08-24 10 views
7

Estoy intentando integrar el An Improved Liberal, Accurate Regex Pattern for Matching URLs de John Gruber en uno de mis JavaScript, pero el inspector de WebKit (en Google Chrome 5.0.375.125 para Mac) da un error de sintaxis de expresión regular de "grupo inválido". expreg originales¿Cómo soluciono el error de "grupo no válido" cuando trato de usar el patrón de expresiones regulares de URL mejoradas de Gruber en JavaScript?

de Gruber es el siguiente:

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

La línea de mi JavaScript w/la expresión regular es el siguiente (w/barras diagonales escapados):

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

Y el Google cromo (? V8) error es como sigue:

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

Y el error Safari es el siguiente:

SyntaxError: Invalid regular expression: unrecognized character after (? 

Afirma que debería funcionar en los modernos intérpretes de expresiones regulares de JavaScript, que Me asumir WebKit & V8 sería. ¿La sintaxis de expresiones regulares de JavaScript no es compatible con la sintaxis de agrupación (?: (maldito Google para no indexar la puntuación)? ¿Extrañaba escapar algo?

Respuesta

14

Gah, fue el modificador de modo (es decir, el (?i)) al comienzo de la expresión regular.

Fui a través Regular-Expressions.info's datails on "JavaScript's Regular Expression Flavor", específicamente la lista de lo que está no soportado, y no fue el 'modo de modificador', que ya había especificado después del cierre de barra diagonal de la expresión regular. Lo arrancó y todo parece estar bien.

lo tanto, mi expresión regular JavaScript es ahora de la siguiente manera:

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

gracias, necesitaba esto para mi propio proyecto! –

+0

¡Me alegro de que haya sido útil! – morgant

+0

Tengo problemas para encontrar "example.com". 'http://example.com' y 'www.example.com' funcionan. ¿Tienes alguna idea? –

Cuestiones relacionadas