当我在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;
}
答案 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)