【问题标题】:password checking function with preg_match [duplicate]preg_match 的密码检查功能
【发布时间】:2017-03-30 11:37:33
【问题描述】:

我有这个功能:

public static function encPasswordCheckFailed($password)
    {
        if (!preg_match('/[A-Z]+/', $password)){
            return true;
        }
        if (!preg_match('/[a-z]+/', $password)){
            return true;
        }
        if (!preg_match('/[0-9]+/', $password)){
            return true;
        }
        if (!preg_match('/[!@#$%^&*()-+<>]+/', $password)) {
            return true;
        }

        return false;
    }

现在我想强制用户至少拥有 1 个大写字母、1 个小写字母、1 个数字和 1 个特殊字符。

我遇到了这个问题:

if (!preg_match('/[!@#$%^&*()-+<>]+/', $password)) {
    return true;
}

所有其他要求都有效。我只有特殊字符的问题。
谁能告诉我这些特殊字符的正确模式:!@#$%^&amp;*()-+&lt;&gt;

我已经阅读了来自 hereherehere 的一些答案,但它们并没有进一步帮助我......

【问题讨论】:

  • 一见钟情.. 避开-,尽管在这种情况下它并没有那么有害。究竟是什么不工作?
  • 看看 Doruk Ayar 的回答。您必须为正则表达式转义 () 特殊字符才能将它们“视为”字符。
  • 转义破折号(即[!@#$%^&amp;*()\-+&lt;&gt;])或将其移动到开头[-!@#$%^&amp;*()+&lt;&gt;*]或结尾@​​987654331@
  • 答案是:将- 放在字符类的末尾/开头,以防它在单独的字符之间创建一个范围。或者转义连字符。

标签: php regex validation


【解决方案1】:

破折号/减号字符是您的问题,因为在字符组内时,它表示字符范围。

您需要:

  • 用反斜杠转义,使其不被视为特殊字符:
    /[!@#$%^&amp;*()\-+&lt;&gt;]+/
  • 或者把它放在模式的末尾,这样 PCRE 引擎就知道它不可能表示一个范围:
    /[!@#$%^&amp;*()+&lt;&gt;-]+/

同样,插入符号 (^) 也是一个特殊字符,在字符组内表示否定,但由于您没有将它放在字符组内的第一个位置,所以 PCRE 引擎知道它有您的情况没有特殊含义。

【讨论】:

  • 这终于成功了:) 谢谢
【解决方案2】:

您可能需要转义正则表达式引擎使用的一些特殊字符。顺便说一句,你也可以在一个 Go 中做到这一点,如下所示。 Quick-Test Here.

<?php


    /*public static*/ function encPasswordCheckFailed($password) {
        // THIS READS:
        // IF THE PASSWORD DOES CONTAIN AN UPPER-CASE CHARACTER
        // AND ALSO DOES CONTAIN A LOWER-CASE CHARACTER
        // AND STILL DOES CONTAIN A NUMERIC CHARACTER
        // AND EVEN MORE, DOES CONTAIN ANY  OF THE SPECIFIED SPECIAL CHARACTERS 
        // RETURN FALSE OTHERWISE RETURN TRUE
        if (preg_match('/[A-Z]+/', $password) &&                    // CHECK FOR UPPERCASE CHARACTER
            preg_match('/[a-z]+/', $password) &&                    // AND CHECK FOR LOWERCASE CHARACTER
            preg_match('/[0-9]+/', $password)&&                     // AND CHECK FOR NUMERIC CHARACTER
            preg_match('/[\!@#$%\^&\*\(\)\-\+<>]+/', $password)     // AND CHECK FOR SPECIAL CHARACTER
        ) {
            return false;
        }

        return true;
    }

    var_dump( encPasswordCheckFailed("abcd123") );    //<== boolean true
    var_dump( encPasswordCheckFailed("abcD123") );    //<== boolean true
    var_dump( encPasswordCheckFailed("abcD1@23-") );  //<== boolean false

【讨论】:

    【解决方案3】:

    这将适用于特殊字符:

    preg_match('/\[!@#$%^&*\(\)\-+<>\]+/', $password);
    

    如果不起作用,请往下看:

    其他答案:

    1. preg_match php special characterspmm的回答)

    【讨论】:

    • 你为什么要转义所有这些字符?这不是强制性的,它使正则表达式不可读。
    • 我会编辑等一下
    • 不工作....
    • @Blueblazer172 您遇到了哪个错误?或者当你使用它时会发生什么?
    • 已更新我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2020-12-22
    • 1970-01-01
    • 2010-12-17
    • 2019-06-04
    • 1970-01-01
    • 2015-05-30
    相关资源
    最近更新 更多