2011-02-13 11 views
17

De acuerdo con la String.prototype.replace() page on MDN, debería ser capaz de reemplazar fácilmente varios patrones sólo mediante el uso¿Por qué el javascript no reemplaza el indicador global funciona en Chrome o IE, y cómo puedo solucionarlo?

str.replace('what to replace', 'replace with', 'flags') 

y el establecimiento de las banderas para 'g'.

Funciona perfecto en Firefox 3.6. Pero en Chrome e IE8, solo reemplaza al primer 'what to replace'.

que puede utilizar la sintaxis

str.replace(/what to replace/gi, 'replace with') 

. Pero estoy sacando el 'what to replace' de una matriz, lo que hace que sea difícil agregar los indicadores en esa sintaxis.

Aquí está el código que estoy tratando de usar. ¿Cómo lo modifico para que funcione tanto en Chrome como en Firefox?

function generateQuestion() 
{ 
    //alert('variable length: '+variableList.length); 
    for(i=0;i<variableList.length;i++) 
    { 
     variable = variableList[i]; 
     rep = replacementList[i]; 
     flags = "gi"; 
     questionText = questionText.replace(variable, rep, flags); 
    } 
} 

¿Y por qué tengo que molestarme en modificarlo? ¿No debería Chrome evaluar el JavaScript como se describe en el enlace?

Respuesta

26

La misma página se ha vinculado a menciona:

El uso del parámetro banderas de el método String.replace no es estándar. Para la compatibilidad entre navegadores, use un objeto RegExp con los indicadores correspondientes.

Básicamente, solo debería funcionar en Firefox. De acuerdo con la documentación, puede generar de forma dinámica utilizando expresiones regulares new RegExp:

var regex = new RegExp(variable, 'gi'); 
questionText = questionText.replace(regex, rep); 

Esto tendrá variable ser escapado, sin embargo.

+0

¡Gracias! Sabía que tenía que ser algo simple como eso. Solo necesitaba otra persona para ver el problema.: D –

+2

Pero entonces tienes un problema que las cadenas para RegExp tienen que ser escapadas, lo cual es bastante propenso a errores. – Mitar

+0

@Mitar Es desafortunado, pero no hay forma de evitarlo. Solo tienes que tener cuidado con tu escape –

4

Parece que la implementación de webkit de string.replace quizás no tenga el 3er parámetro, ya que 'foo'.replace('o','i','g') da como resultado fio para mí.

aparece lo siguiente para trabajar sin embargo:

'foo'.replace(/o/gi,'i') 

Otra opción es:

'foo'.replace(new RegExp('o', 'gi'),'i') 
0

De Mozilla Developer Network - JavaScript - String - replace

no estándar

El uso del parámetro de banderas en el método String.replace no es estándar. Para la compatibilidad entre navegadores, use un objeto RegExp con los indicadores correspondientes.

Trabajando en Chrome y Firefox

Para obtener su código funcione en Chrome y Firefox, que tendrá que crear un objeto RegExp (ya que sus cadenas no están codificados) con las banderas apropiadas. Ver Mozilla Developer Network - RegExp

+0

Pero entonces tienes un problema que las cadenas para RegExp tienen que ser escapadas, lo cual es bastante propenso a errores. – Mitar

Cuestiones relacionadas