IE中的JavaScript RegExp兼容性

时间:2009-12-14 14:02:24

标签: javascript regex cross-browser internet-explorer-6 compatibility

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

是为了在基于JavaScript的新密码检查中匹配以下条件,

  • 必须包含最少8到20个字符,强制性地包括一个字母和数字
  • 可能只包含以下特殊字符之一:%,&,_,?,#,=, -
  • 不能有任何空格

使用上述正则表达式,goog123#在FF3.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 

2 个答案:

答案 0 :(得分:4)

正则表达式存在许多问题。试试这个:

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

是:

^                    # start-of-string
(?=.{,19}\d)         # look-ahead: a digit within 20 chars
(?=.{,19}[a-zA-Z])   # look-ahead: a letter within 20 chars
[\w%&?#=-]{8,20}     # 8 to 20 chars of your allowed range
$                    # end-of-string

答案 1 :(得分:1)

这是我在筛选时发现的。

  1. 在找到较低的出现次数时,计数从第一次前瞻匹配结束开始。尽管如此,最终的比赛只能从字符串的开头进行。
  2. 对于较高的计数,行为与预期一致。
  3. 此问题的最终正则表达式是

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