我正在使用它来尝试在ColdFusion 7中验证“强”密码。
if ( REFind("^(?=.*[A-Z])(?=.*[!@##$&*])(?=.*[0-9])(?=.*[a-z]).{6}$", myPassword, 1) EQ 0 )
然而,它失败了。有人可以指出我的错误吗?
我正在测试的认为的标准是:
非CF人士的脚注:
答案 0 :(得分:4)
好的,你试图测试的标准很糟糕。
例如,Pa$5word
符合条件但是选择不当,而my name |z NOT Fr£d
更强但却失败(没有数字;不同的符号)。
理想情况下,你应该寻找和现有的密码强度检查器(虽然我不知道是否有任何现有/好的)。
无论如何,对于你所问的一个简单的解决方案,它确切地说明了正在检查的内容,只需这样做:
<cfif NOT
( len(myPassword) GTE 6
AND refind('[A-Z]',myPassword)
AND refind('[a-z]',myPassword)
AND refind('[0-9]',myPassword)
AND refind('[!@##$&*]',myPassword)
)>
没有必要/好处将它们全部刷成一个正则表达式。
答案 1 :(得分:0)
可能失败的一个原因是您的业务规则是“至少六个字符”,但您的正则表达式只执行六个字符。
另外:它说明了哪些条件失败会对你有所帮助。我的表面测试表明你没事,除了我上面提到的警告。如果你可以微调你的问题,指出我没有考虑的非表面测试是否失败,那将是有帮助的。
在现实世界中,我也期待你认为有效的标点字符。你的清单有点短。但这与你目前的问题有关。
答案 2 :(得分:0)
试试这个。
^(= [AZ]。)(= [@ ## \ $&安培; <!EM>]。)?(= [0-9] )(?=。* [AZ])。{6,} $
在六个之后添加逗号,因为您要允许超过6个字符,并且$必须使用\ $
进行转义<强>更新强>
尝试以下,^和$从上面删除
(= [AZ]。)(= [@ ## $&安培; <!EM>]。)(?= [0-9])( ?=。* [AZ])。{6,}
答案 3 :(得分:0)
fwiw将不同的角色失败分开:
<cfscript> raRe=[["[a-z]","lowercase"],["[A-Z]","uppercase"],["[\W]","non-alphanumeric"],["[\d]","numeric"]];</cfscript>
<cfoutput>
<cfloop from=1 to=4 index="idxRe">
#idxRe#: refind(raRe[idxRe][1], myPassword):<b>#refind(raRe[idxRe][1], myPassword)#</b> myPassword:<b>#myPassword#</b>; re:<b>#raRe[idxRe][1]#</b>; <br />
<cfif refind(raRe[idxRe][1], myPassword) eq 0><b>Your password must include at least one #raRe[idxRe][2]# character</b><br /></cfif>
</cfloop>
</cfoutput>
当然,如果还需要&gt; = 6:
<cfif Len(myPassword) lte 6><b>Your password must be at least 6 characters long</b></cfif>