我在离线借用的代码片段中有这个表达式。它强制新用户拥有一个密码,不仅需要上+下+数字,而且必须按顺序排列!如果我输入lower + upper +数字,则会失败!
if (preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $pw_clean, $matches)) {
我在线搜索但找不到能告诉我某些字符含义的资源。我可以看到模式是preg_match(“/ some expression /”,yourstring,你的匹配)。
这是什么意思:
1. ^ - ???
2. .* - ???
3. (?=.{4,}) - requires 4 characters minimum
4. (?.*[0-9]) - requires it to have numbers
5. (?=.*[a-z])- requires it to have lowercase
6. (?=.*[A-Z])- requires it to have uppercase
7. .*$ - ???
答案 0 :(得分:15)
以下是直接答案。我保持简短,因为如果不了解正则表达式就没有意义。这种理解最好在regular-expressions.info上获得。我建议你也试试那里列出的regex helper tools,它们允许你进行实验 - 在编辑模式时看到实时捕捉/匹配,非常有帮助。
1:插入符^
是一个锚,它的意思是“干草堆/字符串/行的开头”。
[]
中的第一个符号,则它具有不同的含义:它否定了该类。 (所以在[^ab]
中,插入符号使该类匹配不 ab)的任何内容 2:点.
和星号*
有两个不同的用途:
\n
以外的任何单个字符。当这两者合并为.*
时,它基本上会读取“零或更多的任何内容,直到换行符或其他规则生效”。
7:美元$
也是像插入符号一样的锚点,具有相反的功能:“大海捞针的结尾”。
修改强>
简单的括号( )
围绕某些东西使它成为组。这里有(?=)
这是一个断言,特别是正面向前断言。它所做的就是检查大海捞针当前光标位置内部实际存在的内部。还是和我一起?示例: foo(?=bar)
仅在foo
后跟bar
匹配。 <{1}}永远不会匹配,只返回bar
。
考虑到这一点,让我们剖析你的正则表达式:
foo
你说密码字符的顺序很重要 - 它在我的测试中没有。请参阅下面的测试脚本希望这清理了一两件事。如果您正在寻找另一个更宽容的正则表达式,请参阅regex password validation
/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/
Reads as:
^.* From Start, capture 0-many of any character
(?=.{4,}) if there are at least 4 of anything following this
(?=.*[0-9]) if there is: 0-many of any, ending with an integer following
(?=.*[a-z]) if there is: 0-many of any, ending with a lowercase letter following
(?=.*[A-Z]) if there is: 0-many of any, ending with an uppercase letter following
.*$ 0-many of anything preceding the End
用于检查和测试正则表达式的优秀在线工具: https://regex101.com/
答案 1 :(得分:2)
答案 2 :(得分:1)
首先要使用正则表达式,您需要学习语法。这个语法包含一系列字母,数字,点,连字符和特殊符号,我们可以使用不同的括号将它们组合在一起。
请看这个链接Getting Started with PHP Regular Expressions。学习正则表达式的简便方法。