PHP如何让这个preg_match正则表达式工作?

时间:2014-03-09 18:16:58

标签: php regex preg-match

我必须有一个包含至少一个小写字母,大写字母,数字和符号(非字母或数字)的正则表达式。我也必须没有空格,长度必须在8到16个字符之间。我必须使用0-9a-zA-z表达式。我不能用任何其他来代表字母和数字。

我遇到了一些问题,希望你们能帮助我。我会用线条分开问题。



1)量词不工作

    <?php

        $Password = "Fondulious16";

        echo preg_match("/[0-9a-zA-Z]{8,16}[^\s]/", $Password);


    ?>

现在,如果我将密码更改为低于8个字符,它会返回0。但如果我超过16个字符,它仍会返回1。



2)要求不起作用

如果我将括号更改为括号,它总是返回0,我可以删除大写字母。所以我需要把它带到需要资金,小写和数字的地方。我尝试添加+符号,但无济于事:

    <?php

        $Password = "Fondulious16";

        echo preg_match("/[0-9+a-z+A-Z+]{8,16}[^\s]/", $Password);      

    ?>

这没有做任何事情,当我将密码更改为“fondulious”之类的内容时没有任何改变。

    <?php

        $Password = "Fondulious16";

        echo preg_match("/(0-9a-zA-Z){8,16}[^\s]/", $Password);     

    ?>

这总是返回0.



提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

在这两种情况下,您的问题是[^\s]\S基本相同;简而言之:除了空间角色之外的任何东西。

因此,只要确实存在至少一些字符(即不是字符串的结尾),表达式的最后一部分就会匹配任何内容。

此外,您无法在一个选择/范围(+)内使用[...]量词。它只是一个普通字符,默认情况下,量词跟随者可以根据需要经常选择任何有效字符(无论如何都没有简单的方法强制元素是唯一的)。

因此,要解决您的问题,您应该使用以下正则表达式:

<?php
    $password = "Fondulious16";
    echo preg_match('/^\w{8,16}$/', $password);
?>

以下是元素的简短说明:

  • ^将匹配字符串的开头。
  • \w将匹配任何字母数字字符加下划线(基本上为[a-z0-9_],但不区分大小写)。
  • {8,16}是您使用它的量词“8到16次”。
  • $将匹配字符串的结尾。

如果您不希望下划线有效,可以使用以下变体。

<?php
    $password = "Fondulious16";
    echo preg_match('/^[0-9a-z]{8,16}$/i', $password);
?>

您可能已经注意到我没有列出大写字符。相反,我在尾随分隔符(i)之后使用了修饰符/i,这将告诉算法在尝试匹配它们时忽略所有字符的大小写。


虽然重要的是要注意,此检查将强制用户使用小写和大写字符以及数字。它只会检查用户是否使用了任何其他字符(如标点符号或空格)以及长度!

要强制用户另外使用所有这些内容,您可以使用以下检查:

<?php
    $password = "Fondulious16";
    echo preg_match('/[A-Z]/', $password)   // at least one uppercase character
        && preg_match('/[a-z]/', $password) // at least one lowercase character
        && preg_match('/\d/', $password);   // at least one number
?>

如果你想进行这些检查并且想要验证长度,那么你可以使用下面的表达式来查找非法字符(以及一个简单的字符串长度检查以确保长度很好):< / p>

<?php
    $password = "Fondulious16";
    echo ($pwlen = strlen($password)) >= 8 && $pwlen <= 16 // has the proper length
        && preg_match('/[A-Z]/', $password)         // at least one uppercase character
        && preg_match('/[a-z]/', $password)         // at least one lowercase character
        && preg_match('/\d/', $password)            // at least one number
        && !preg_match('/[^a-z\d]/i', $password); // no forbidden character
?>

答案 1 :(得分:0)

请看下面的内容 示例

    if (!preg_match('/([a-z]{1,})/', $value)) {
    // atleast one lowercase letter
}

        if (!preg_match('/([A-Z]{1,})/', $value)) {
    // atleast one uppercase letter
}

if (!preg_match('/([\d]{1,})/', $value)) {
    // altelast one digit
}

if (strlen($value) < 8) {
             // atleast 8 characters length

}