IE中JavaScript的正则表达式兼容性问题

5
^(?=[\w\-%&?#=]+\d)(?=[\w\-%&?#=]+[a-zA-Z])[\w\-%&?#=]{8,12}$

该JavaScript代码用于新密码检查,以下是要求:

  • 密码长度必须在8到20个字符之间,必须包含至少一个字母和数字
  • 只能包含以下特殊字符中的一个:%,&,_,?,#,=,-
  • 不能有任何空格

使用上述正则表达式,goog123#可以在Firefox 3.5中匹配。但是,在IE6中无法匹配。是否有人知道出了什么问题?这是兼容性问题吗?

该JavaScript代码用于测试匹配。

function fnIsPassword(strInput)
{
  alert("strInput : " + strInput);
  var regExp =/^(?=.{0,19}\d)(?=.{0,19}[a-zA-Z])[\w%&?#=-]{8,20}$/;
  if(strInput.length > 0){
     return (regExp.test(strInput));
  }
  return false;
}
alert(fnIsPassword("1231231")); //false 
alert(fnIsPassword("sdfa4gggggg")); //FF: true, false in IE  
alert(fnIsPassword("goog1234#")); //FF: true , false in IE 

13
如果在IE6上出现问题,那就没什么问题。 - Rubens Farias
1
@Rubens 可能是我听过的最有趣、最准确的陈述之一。 - Chris
2个回答

4
正则表达式存在许多问题。请使用以下正则表达式:
^(?=.{,19}\d)(?=.{,19}[a-zA-Z])[\w%&?#=-]{8,20}$
该正则表达式为:
^                    # 开始
(?=.{,19}\d)         # 向前查找:20 个字符内的数字
(?=.{,19}[a-zA-Z])   # 向前查找:20 个字符内的字母
[\w%&?#=-]{8,20}     # 在允许范围内,从 8 到 20 个字符
$                    # 结尾

请注意,保留了 HTML 标签。

我在Windows XP上使用JScript尝试了您的测试脚本(IE6使用JScript 5.6),并且它正确地返回了第一个测试的0(= false)和另外两个测试的-1(= true)。您可以将其保存为.js文件并单独尝试吗? - Tomalak
还有其他人能重现这个问题吗?对我来说,所有测试仍然返回false。我让我的同事在他的Windows XP电脑上重现了这个问题。我的IE版本是6.0.2900.5512.xpsp_sp3_gdr.090804-1435我也尝试按照你建议的给出language="JScript"。感觉被pwned :( - mays
你的 JScript 版本是多少?如果低于 5.6,请更新到最新版本,看看是否有帮助。 - Tomalak
ScriptEngineMajorVersion() = 5 ScriptEngineMinorVersion() = 7 - mays
我使用的是IE8,JScript 5.7。除非我大错特错,否则IE版本不应该影响这个问题。所有IE JavaScript处理都由安装在您系统上的JScript引擎处理(如果我说错了,请纠正我)。如果在.js文件中可以运行,那么它应该也可以在IE中运行。 - Tomalak
显示剩余8条评论

1

我在筛选中找到了这个。

  1. 在查找出现次数的较低计数时,计数从第一个前瞻匹配的末尾开始。尽管如此,最终的匹配只会从字符串的开头开始。
  2. 对于较高的计数,行为与预期相同。

此问题的最终正则表达式为

/(?=^[\w%&?#=-]{8,12}$)(?=.+\d)(?=.+[a-zA-Z]).+/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接