PHP正则表达式密码验证寻求解释

时间:2013-11-07 12:30:06

标签: php regex

哟所有,

所以我正在学习regexp :-) yay

我正在学习如何解析必须包含1个大写字母和1个数字的密码字符串,并且可以在6到12个字符之间。

我对这个有了解释。

$array = array("Hallo1ween23");

$match = preg_grep('%^(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])\S{6,12}$%',$array);

foreach($match as $value) {
    echo "<pre>" .$value . "<br>";
}

基本上我理解这些部分:

我所知道的例子:

此行%(?<=mail)man%会查找以mail开头并以man

结尾的字词

好吧.. (?=[a-z]*?[A-Z])一个简单的版本,但仍然是相同的逻辑。我不明白。

所以如果有帮助的话,我会把整个阵容打破3。

接下来的两个我不知道。

(?=[-_a-zA-Z0-9]*?[A-Z])
(?=[-_a-zA-Z0-9]*?[a-z])

我知道\ s表示空格,\ s表示非空白,但我真的不明白它的目的。

(?=[-_a-zA-Z0-9]*?[0-9])\S

这是接受的最小和最大字母。

{6,12}

一些解释很简洁。

提前感谢: - )

@Tafari

基本上就是这条线。

(?=[-_a-zA-Z0-9]*?[A-Z])

在整个正则表达式行的末尾\S

我理解[-_a-zA-Z0-9]

*表示零或更多

?意味着我们不确定它是否存在

把它放在一起我松了那个。

2 个答案:

答案 0 :(得分:3)

首先阅读以下内容Lookahead and Lookbehind Zero-Length Assertions ...

以下断言得到承认。

(?!)  - Negative Lookahead     foo(?!bar)  matches foo when not followed by bar
(?=)  - Positive Lookahead     foo(?=bar)  matches foo when followed by bar
(?<!) - Negative Lookbehind    (?<!foo)bar matches bar when bar is preceded by foo
(?<=) - Positive Lookbehind    (?<=foo)bar matches bar when preceded by foo
  

接下来的两个我不明白......

(?=                  look ahead to see if there is:
 [-_a-zA-Z0-9]*?     any character of: '-', '_', 'a' to 'z', 
                     'A' to 'Z', '0' to '9' (0 or more times)
  [A-Z]              any character of: 'A' to 'Z'
)                    end of look-ahead

(?=[-_a-zA-Z0-9]*?[a-z])相同的概念,除了您匹配az的任何字符

接下来,\s匹配空格,\S匹配非空格。

(?=                  look ahead to see if there is:
 [-_a-zA-Z0-9]*?     any character of: '-', '_', 'a' to 'z',
                     'A' to 'Z', '0' to '9' (0 or more times)
 [0-9]               any character of: '0' to '9'
)                    end of look-ahead
\S                   non-whitespace (all but \n, \r, \t, \f, and " ")

以下量词被认可。

*      Match 0 or more times
+      Match 1 or more times
?      Match 1 or 0 times
{n}    Match exactly n times
{n,}   Match at least n times
{n,m}  Match at least n but not more than m times

祝你好运。

答案 1 :(得分:1)

你是正确的(?= ... )表达式look-aheads。唯一需要注意的关键是使用?,通过搜索正则表达式greediness可以更好地解释这一点。

所以^(?=[-_a-zA-Z0-9]*?[A-Z])基本上读作:向前看,找到任何字母数字字符和/或连字符或下划线直到找到至少一个大写字母。

(?=[-_a-zA-Z0-9]*?[a-z])同上: ...小写字母。

(?=[-_a-zA-Z0-9]*?[0-9])同上: ...号码。

转义序列\S实际上正在执行“匹配”,假设前瞻已经满足。大写\S{6,12}读作:匹配长度为6到12个字符的任何非空白字符序列。