7

我在离线借用的代码片段中有这个表达式。它强制新用户的密码不仅需要大写+小写+数字,而且必须按照这个顺序!如果我输入低+大+数字,它会失败!

if (preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $pw_clean, $matches)) {

我在网上搜索过,但找不到能告诉我某些字符含义的资源。我可以看到模式是 preg_match("/some expression/",yourstring,your match)。

这些是什么意思:

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.  .*$        -  ???
4

3 回答 3

17

以下是直接答案。我把它们写得很短,因为如果不了解正则表达式,它们就没有意义。这种理解最好在regular-expressions.info 中获得。我建议您也尝试那里列出的正则表达式帮助工具,它们允许您进行实验 - 在您编辑模式时查看实时捕获/匹配,非常有帮助。


1:插入符号^是一个锚点,它的意思是“草垛/字符串/线的开始”。

  • 如果插入符号是字符类中的第一个符号[],则它具有不同的含义:它否定类。(所以在[^ab]插入符号中使该类匹配任何不是ab的东西)

2:点.和星号*有两个不同的用途:

  • 点匹配除换行符以外的任何单个字符\n
  • 星号表示“允许零个或多个前面的类型”。

当这两者结合起来时,.*它基本上读作“零个或多个任何东西,直到换行符或其他规则生效”。

7:美元$也像插入符号一样是锚,功能相反:“大海捞针”。


编辑:

围绕某事物的简单括号( )使其成为一个。在这里你有(?=)一个断言,特别是一个积极的前瞻性断言。它所做的只是检查里面的内容是否从大海捞针中的当前光标位置向前移动。还在我这儿?
示例: 仅当后跟 时才foo(?=bar)匹配。从不匹配,只返回。foobarbarfoo

考虑到这一点,让我们剖析您的正则表达式:

/^.*(?=.{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

您说密码字符的顺序很重要-在我的测试中并不重要。请参阅下面的测试脚本。希望这能解决一两件事。如果您正在寻找另一个更宽容的正则表达式,请参阅正则表达式密码验证

<pre>
<?php
// Only the last 3 fail, as they should. You claim the first does not work?
$subjects = array("aaB1", "Baa1", "1Baa", "1aaB", "aa1B", "aa11", "aaBB", "aB1");

foreach($subjects as $s)
{
    $res = preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $s, $matches);
    echo "result: ";
    print_r($res);

    echo "<br>";
    print_r($matches);
    echo "<hr>";
}

用于检查和测试正则表达式的优秀在线工具: https ://regex101.com/

于 2012-04-18T04:44:08.630 回答
2

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

查看此链接Getting Started with PHP Regular Expressions。学习正则表达式的简单方法。

于 2013-02-12T11:50:00.880 回答
2

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

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

正则表达式.info

于 2012-04-18T01:00:06.633 回答