Ricerca nel sito web

javascript - Perché RegExp genera un errore di "quantificatore inaspettato" su IE8?


Ho un errore di Javascript che mi è stato segnalato e purtroppo non ho idea di come riprodurlo. Gli strumenti per sviluppatori di IE8 riportano il seguente errore: Quantificatore imprevisto. La seguente riga produce l'errore:

var g=RegExp(d+"=([^|]*)").exec(j); //output from closure-compiler

Immagino di dover scappare correttamente la pipe in quel modo (\\|) per risolvere il problema, ma non so se ho ragione perché non so come riprodurre l'errore.

Qualsiasi suggerimento o soluzione è benvenuto.

Grazie.

[AGGIORNAMENTO]

I valori di d sono le chiavi dei valori del cookie __utmz che sto cercando di recuperare e sono elencati in un array come questo ["utmccn", "utmcmd", /* ... */]. Beh, ora non c'è molto che possa fare, sono a casa con il mio amico l'influenza.

Risposta n. 1

Un "quantificatore" è un operatore di espressioni regolari come * o +. La variabile "d" nel codice sopra probabilmente contiene qualcosa che viene interpretato come "codice" dal parser di espressioni regolari, ed è invalido. Hai ragione nel dire che deve essere opportunamente escape. È un problema molto simile al problema di escapare il testo incluso nel markup HTML, ma distinto perché la sintassi in questione è completamente diversa (cioè, sintassi delle espressioni regolari vs. sintassi HTML).

Ci sono molti caratteri speciali nella sintassi delle espressioni regolari, ovviamente, quindi ci vorrà un'espressione regolare piuttosto complessa per fare ciò. Ecco un possibile modo per fare una cosa del genere:

var quoted = unquoted.replace(/([*+.?|"[\]{}()])/g, '\\$1');

Potrebbe non prenderli tutti; darei un'occhiata in giro a codice che sia più sicuramente testato rispetto a qualcosa che uno sciocco come me ha appena inventato :-)

Dato che quel codice che hai postato sembra provenire da qualche libreria, potresti voler controllare lo stack trace dal debugger di IE per scoprire dove inizia il problema.

Risposta n. 2

Come regola generale, dovresti sempre scappare i caratteri speciali all'interno delle classi di caratteri, non si sa mai quando ci si imbatterà in un motore regexp che fallirà.