Chr*_*ris 5 javascript php regex
我需要一个用于测试字符串的正则表达式
A-Za-z0-9#,.-_有没有办法可以将它包装在一个正则表达式中(目前我有一个javascript和php函数可以完成三个单独的测试,一个是总共14个,另一个是至少有两个数字,另一个是在至少6个字母.
所以以下内容是有效的:
rid*_*ner 15
简单!首先让我们看一下PHP中的注释版本:
$re = '/# Match 14+ char password with min 2 digits and 6 letters.
^ # Anchor to start of string.
(?=(?:.*?[A-Za-z]){6}) # minimum of 6 letters.
(?=(?:.*?[0-9]){2}) # minimum of 2 numbers.
[A-Za-z0-9#,.\-_]{14,} # Match minimum of 14 characters.
$ # Anchor to end of string.
/x';
Run Code Online (Sandbox Code Playgroud)
这是JavaScript版本:
var re = /^(?=(?:.*?[A-Za-z]){6})(?=(?:.*?[0-9]){2})[A-Za-z0-9#,.\-_]{14,}$/;
Run Code Online (Sandbox Code Playgroud)
附录20121130:
我注意到这个答案最近得到了一个upvote.这使用了一个更过时的表达式,所以我觉得是时候用更好的表达来更新它...
通过完全摆脱点星并贪婪地应用更精确的表达式(一个否定的char类),可以得到更有效的解决方案:
$re = '/# Match 14+ char password with min 2 digits and 6 letters.
^ # Anchor to start of string.
(?=(?:[^A-Za-z]*[A-Za-z]){6}) # minimum of 6 letters.
(?=(?:[^0-9]*[0-9]){2}) # minimum of 2 numbers.
[A-Za-z0-9#,.\-_]{14,} # Match minimum of 14 characters.
$ # Anchor to end of string.
/x';
Run Code Online (Sandbox Code Playgroud)
这是新的JavaScript版本:
var re = /^(?=(?:[^A-Za-z]*[A-Za-z]){6})(?=(?:[^0-9]*[0-9]){2})[A-Za-z0-9#,.\-_]{14,}$/;
Run Code Online (Sandbox Code Playgroud)
编辑:添加#,.-_到有效字符列表.
编辑:将贪婪变为懒惰的星.
编辑20121130:添加了替代版本,将lazy-dot-star替换为更精确的表达式的更有效的贪婪应用程序.
我会建议多次检查,为此写一个正则表达式会很难看.多次检查还可以让您了解未达到的标准.
$input = 'blabla2bla2f54a';
$errors=array();
if (!preg_match('/^[A-Za-z0-9#,.\-_]*$/', $input))
$errors[] = 'Invalid characters';
if (strlen($input) < 14)
$errors[] = 'Not long enough';
if (strlen(preg_replace('/[^0-9]/','',$input)) < 2)
$errors[] = 'Not enough numbers';
if (strlen(preg_replace('/[^A-Za-z]/','',$input)) < 6)
$errors[] = 'Not enough letters';
if (count($errors) > 0) //Didn't work
{
echo implode($errors,'<BR/>');
}
Run Code Online (Sandbox Code Playgroud)