Почему JavaScript не заменяет глобальный флаг, работающий в Chrome или IE, и как мне обойти это? - PullRequest
17 голосов
/ 13 февраля 2011

Согласно странице String.prototype.replace() в MDN , я могу легко заменить несколько шаблонов, просто используя

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

и установка флагов на 'g'.

Отлично работает в Firefox 3.6. Но в Chrome и IE8 он заменяет только первый 'what to replace'.

Я могу использовать

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

синтаксис. Но я вытаскиваю 'what to replace' из массива, что затрудняет добавление флагов в этом синтаксисе.

Вот код, который я пытаюсь использовать. Как я могу изменить его для работы в Chrome, а также 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);
    }
}

И зачем мне вообще его модифицировать? Разве Chrome не должен оценивать JavaScript, как описано в ссылке?

Ответы [ 3 ]

27 голосов
/ 13 февраля 2011

На самой странице, на которую вы ссылались, упоминается:

Использование параметра flags в методе String.replace не является стандартным.Для кросс-браузерной совместимости используйте объект RegExp с соответствующими флагами.

По сути, он должен работать только в Firefox.Согласно документации, вы можете генерировать регулярные выражения динамически, используя new RegExp:

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

Однако для этого потребуется экранирование variable.

4 голосов
/ 13 февраля 2011

Похоже, что реализация webkit для string.replace, возможно, не имеет 3-го параметра, так как 'foo'.replace('o','i','g') приводит к fio для меня.

Однако работает следующее:

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

Другой вариант:

'foo'.replace(new RegExp('o', 'gi'),'i')
0 голосов
/ 13 февраля 2011

Из Сеть разработчиков Mozilla - JavaScript - String - заменить

Нестандартные

Использование параметра flags в методе String.replace является нестандартным. Для кросс-браузерной совместимости используйте объект RegExp с соответствующими флагами.

Работа в Chrome и Firefox

Чтобы ваш код работал в Chrome и Firefox, вам нужно создать объект RegExp (поскольку строки не жестко заданы) с соответствующими флагами. См. Сеть разработчиков Mozilla - RegExp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...