2011-02-13 7 views
17

Według String.prototype.replace() page on MDN, powinny być w stanie łatwo zastąpić wiele wzorców tylko za pomocąDlaczego javascript nie zastępuje globalnej flagi w Chrome lub IE i jak ją obejść?

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

i ustawienie flagi do 'g'.

Działa doskonale w Firefoksie 3.6. Ale w Chrome i IE8 zastępuje tylko pierwszy 'what to replace'.

mogę użyć składni z

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

. Ale wyciągam 'what to replace' z tablicy, co utrudnia dodawanie flag w tej składni.

Oto kod, którego próbuję użyć. Jak mogę go zmodyfikować do pracy w Chrome, a także w Firefoksie?

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

Dlaczego muszę w ogóle modyfikować? Czy Chrome nie powinien oceniać kodu JavaScript zgodnie z opisem w linku?

Odpowiedz

26

Sama strona, którą powiązana jest mowa o:

Zastosowanie parametru flagi w metoda String.replace jest niestandardowa. Aby uzyskać zgodność z różnymi przeglądarkami, użyj obiektu RegExp z odpowiednimi flagami.

Zasadniczo powinien działać tylko w przeglądarce Firefox. Zgodnie z dokumentacją, można wygenerować regexes dynamicznie przy użyciu new RegExp:

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

ten będzie musiał variable się uciec, jednak.

+0

Dzięki! Wiedziałem, że musi to być coś prostszego. Potrzebowałem tylko innej osoby, aby spojrzeć na problem.: D –

+2

Ale wtedy masz problem, że ciągi dla RegExp muszą być uniknięte, co jest dość podatne na błędy. – Mitar

+0

@Mitar To niefortunne, ale nie da się tego obejść. Musisz tylko uważać na ucieczkę –

4

Wygląda na to, że implementacja string.replace w webkitach może nie mieć trzeciego parametru, ponieważ dla mnie 'foo'.replace('o','i','g') jest wynikiem fio.

Poniższy wydaje się działać jednak:

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

Inną opcją jest:

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

Z Mozilla Developer Network - JavaScript - String - replace

niestandardowy

Użycie parametru flagi w sposobie string.replace nie jest standardem. Aby uzyskać zgodność z różnymi przeglądarkami, użyj obiektu RegExp z odpowiednimi flagami.

Praca w Chrome i Firefox

Aby otrzymać kod do pracy w Chrome i Firefox, musisz utworzyć obiekt RegExp (od struny nie są sztywno) z odpowiednimi flagami. Zobacz Mozilla Developer Network - RegExp

+0

Ale wtedy masz problem, że ciągi dla RegExp muszą być uniknięte, co jest dość podatne na błędy. – Mitar