这些符号在preg_match中意味着什么?

时间:2012-04-18 00:58:12

标签: php preg-match

我在离线借用的代码片段中有这个表达式。它强制新用户拥有一个密码,不仅需要上+下+数字,而且必须按顺序排列!如果我输入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.  .*$        -  ???

3 个答案:

答案 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)

如果你不知道这个网站,你应该立即去那里。

这就像正则表达式的圣经。

Regular-expressions.info

答案 2 :(得分:1)

首先要使用正则表达式,您需要学习语法。这个语法包含一系列字母,数字,点,连字符和特殊符号,我们可以使用不同的括号将它们组合在一起。

请看这个链接Getting Started with PHP Regular Expressions。学习正则表达式的简便方法。