中文字符串上的regex \ s的String.match()在IE8和IE9 / Chrome / Firefox /之间的工作方式不同...

时间:2014-01-27 01:42:18

标签: javascript regex internet-explorer unicode

当我在IE8中使用正则表达式\s匹配中文字符空白( )时,它返回false,这意味着它是一个双字节字符。另一方面,在IE9(或更高版本的IE,Chrome,Firefox,Safari等)中,它返回true,这意味着 是一个单字节字符。实际上,它是一个双字节字符。

我想知道IE8的正则表达式引擎和其他更高版本的浏览器之间是否存在任何差异。它是什么?

代码如下。

function OneByteCharCheck(value) {
    if (value.match(/^(?:[a-zA-Z0-9@\;\:\[\]\{\}\|\^\=\/\!\*\`\"\#\$\+\%\&\'\(\)\,\.\<\>\-\_\?\\\s()ァ-ン゙゚ 。「」、・ヲ~]*)*$/)) {
        return true
    }
    return false;
}

1 个答案:

答案 0 :(得分:2)

差异是因为即使在发布IE8时,IE8以及许多Web标准的表现都不尽如人意。

test page上运行browserstack表示IE8只能匹配Unicode Space Character (Zs)类别中17个字符中的1个,而IE9成功匹配所有17个字符(包括U + 3000)。这很可能是因为微软努力遵守IE9及以上版本中的许多网络标准

即使在 IE8 (已发布 2009年3月)中,其JavaScript引擎也只能匹配1个字符,可能是空格(U + 0020),这意味着它是<强大>不甚至符合ECMA-262第3版(发布 1999年12月),因为第3版规范明确列出了U + 00A0 NO-BREAK SPACE在 7.2空格部分中。虽然从一开始就没有映射所有Zs类别代码点,但是从U + 2000到U + 200A,U + 00A0和U + 3000的代码点已经映射到Unicode 2.0(日期 1996年7月)。

解决方案

bobince中提到的the comment,最好列出所有字符,而不是使用简写字符类表示法。这将确保跨越新旧浏览器的一致行为。

附录

这是我的测试页面的源代码:

<!DOCTYPE html>
<html>
  <meta charset="utf-8">
<body>
<script type="text/javascript">
  var Zs = ['\u0020', '\u00a0', '\u1680', '\u2000', '\u2001',
            '\u2002', '\u2003', '\u2004', '\u2005', '\u2006',
            '\u2007', '\u2008', '\u2009', '\u200a', '\u202f',
            '\u205f', '\u3000'];

  var count = 0;          
  for (var i = 0; i < Zs.length; i++) {
      count += /^\s$/.test(Zs[i]);
  }

  document.write("<h2>" + count + "/" + Zs.length + " in Unicode Zs category passed the test</h2>")
</script>
</body>
</html>

Windows 7 IE8 screenshot (by browserstack)
Windows 7 IE9 screenshot (by browserstack)