2010-08-24 5 views
7

Sto tentando di integrare lo An Improved Liberal, Accurate Regex Pattern for Matching URLs di John Gruber in uno dei miei Javascripts, ma l'ispettore di WebKit (in Google Chrome 5.0.375.125 per Mac) restituisce un errore di sintassi delle espressioni regolari di "Gruppo non valido". regexp originaleCome si corregge l'errore "gruppo non valido" quando si tenta di utilizzare l'URL "migliorato" di Gruber che corrisponde al modello regexp in JavaScript?

di Gruber è la seguente:

(?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 linea dal mio JavaScript w/l'espressione regolare è la seguente (w/slash backslash escape):

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>'); 

e Google Chrome (? V8) errore è la seguente:

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 

e l'errore di Safari è la seguente:

SyntaxError: Invalid regular expression: unrecognized character after (? 

Egli sostiene dovrebbe funzionare nei moderni interpreti espressioni regolari JavaScript, che mi piacerebbe pensare WebKit & V8 sarebbe. La sintassi regexp di JavaScript non supporta la sintassi di raggruppamento (?: (dannazione di Google per non indicizzare la punteggiatura!)? Ho appena perso la fuga da qualcosa?

risposta

14

Gah, era il modificatore di modalità (ad esempio (?i)) all'inizio della regex!

ho passato Regular-Expressions.info's datails on "JavaScript's Regular Expression Flavor", in particolare la lista di ciò che è non supportato, e non c'era la 'modalità modificatore', che avevo già specificato dopo la chiusura in avanti barra del regex. Strappato fuori tutto sembra bene.

Quindi, il mio regex JavaScript è ora la seguente:

/\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

grazie, aveva bisogno di questo per il mio progetto! –

+0

Felice che abbia aiutato! – morgant

+0

In realtà sto riscontrando problemi con l'abbinamento 'example.com'. "http://example.com" e "www.example.com" funzionano entrambi. Hai qualche idea? –

Problemi correlati