【问题标题】:javascript split regex bug in IE7IE7中的javascript拆分正则表达式错误
【发布时间】:2025-12-09 06:40:02
【问题描述】:

我正在尝试在 javascript 中使用此正则表达式 ({[^{}]*}) 进行拆分,但 IE7 和 FF 得到了不同的结果。火狐的结果是正确的。

<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 库的情况下工作?

【问题讨论】:

  • 是的,这是一个错误。你的问题到底是什么?
  • 有没有办法改变正则表达式,使其在 IE7 中也能在不添加 javascript 库的情况下工作?
  • 只用正则表达式解析 CSS 并不一定适合你。

标签: javascript regex split internet-explorer-7


【解决方案1】:

请参阅this old blog post,了解在.split() 正则表达式中处理捕获组的变化的可能解决方案。

来自那篇文章:

  • Internet Explorer 会从结果数组中排除几乎所有空值(例如,当两个分隔符在数据中相邻出现时,或者当分隔符出现在数据的开头或结尾时)。这对我来说没有任何意义,因为 IE 在使用字符串作为分隔符时确实包含空值。
  • Internet Explorer 和 Safari 不会将捕获括号的值拼接到返回的数组中(此功能对于简单的解析器等很有用)
  • 由于未参与的捕获组,Firefox 不会将未定义的值拼接到返回的数组中。
  • Internet Explorer、Firefox 和 Safari 存在各种额外的边缘情况错误,它们不遵循拆分规范(这实际上非常复杂)。

Levithan 的 XRegExp 库非常小而实用,其中包含修复程序。

【讨论】:

  • 任何其他没有库的解决方案?
  • 好吧,你可以看看这个库是做什么的。真的没有那么多代码。但据我所知,您别无选择,只能尽可能“修复”错误/不兼容性。这个库很好,因为它已经过测试,而且它是由一个聪明的人写的,他写了一本关于正则表达式的书:-)
【解决方案2】:

我制定了一个适用于 regex({[^{}]*}) 的解决方案,可能也适用于其他人。

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

【讨论】: