ошибка регулярного выражения в JavaScript в IE7 - PullRequest
4 голосов
/ 11 декабря 2010

Я пытаюсь разделить с помощью этого регулярного выражения ({[^{}]*}) в javascript, и я получаю разные результаты между IE7 и FF.Результат Firefox правильный.

<style>
.box.round {
    border-radius: 10px;
}
</style>
<script>
jQuery(function ($) {
    $('style').each(function () {
    text = $(this).html();

    alert(text);
    alert(text.split(/({[^{}]*})/));
    // result in FF: .box.round ,{border-radius: 10px;},
    // result in IE7: .box.round
    });
});
</script>

Обновление Есть ли способ изменить регулярное выражение, чтобы оно работало в IE7 также без добавления библиотеки JavaScript?

Ответы [ 2 ]

6 голосов
/ 11 декабря 2010

См. этот старый пост в блоге для возможного решения проблемы обработки захваченных групп в .split() регулярных выражениях.

Из этой статьи:

  • Internet Explorer исключает почти все пустые значения из результирующего массива (например, когда два разделителя появляются в данных рядом друг с другом или когда разделитель появляется в начале или конце данных).Это не имеет никакого смысла для меня, так как IE включает пустые значения при использовании строки в качестве разделителя.
  • Internet Explorer и Safari не объединяют значения захвата скобок в возвращаемый массив (эта функция можетполезно с простыми анализаторами и т. д.)
  • Firefox не разбивает неопределенные значения в возвращаемый массив в результате не участвующих групп захвата.
  • Internet Explorer, Firefox и Safari имеют различныедополнительные ошибки в крайнем случае, когда они не соответствуют спецификации split (что на самом деле довольно сложно).

Библиотека Левитана XRegExp действительно мала и полезна, и этовключает исправления.

0 голосов
/ 12 декабря 2010

Я создал решение, которое работает с регулярными выражениями ({[^{}]*}) и, вероятно, с другими тоже.

function ieSplit(str, separator) {
    var match = str.match(RegExp(separator, 'g'));
    var notmatch = str.replace(new RegExp(separator, 'g'), '[|]').split('[|]');
    var merge = [];
    for(i in notmatch) {
        merge.push(notmatch[i]);
        if (match != null && match[i] != undefined) {
            merge.push(match[i]);
        }
    }
    return merge;
}
alert(ieSplit(text, '({[^{}]*})'));
// result in FF : .box.round ,{border-radius: 10px;},
// result in IE7: .box.round ,{border-radius: 10px;},
...