PHP preg_match_all模式

时间:2012-01-28 15:06:13

标签: php regex preg-match

我在php中使用preg_match_all来检查用户名和密码中的字符,然后再添加到数据库中,但我似乎无法按照我想要的方式工作。这就是我现在所拥有的:

preg_match_all(USERNAME_PATTERN,$username,$usernameMatches);
preg_match_all(PASSWORD_PATTERN,$password,$passwordMatches);

以下是模式,定义为常量:

/*Username and Password Patterns*/
define("USERNAME_PATTERN","[-*_a-z0-9A-Z.]");
define("PASSWORD_PATTERN","[_a-z0-9A-Z]");

我不知道它有什么问题。它假设检查用户名是否包含除a-z,A-Z,0-9,短划线,星号,下划线和句点之外的任何内容。密码与用户名相同。

以下是我用来检查的代码:

if ($usernameMatches == 0){
echo("Bad characters in username<br />");
}

密码相同。

4 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。

  1. 您的正则表达式只匹配一个字符。
  2. 正则表达式中没有开始和结束锚点。
  3. 确保在调用preg_match_all()
  4. 之前实例化matches数组
  5. 您的正则表达式应该包含/(或其他有效字符)。
  6. 通过检查数组是否为空来检查不匹配,而不是检查它是否等于零。在PHP中有许多类型/值检查陷阱,最好避免它们。
  7. 试试这个:

    /*Username and Password Patterns*/
    define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
    define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");
    
    $usernameMatches = array();
    $passwordMatches = array();
    
    preg_match_all(USERNAME_PATTERN,$username,$usernameMatches);
    preg_match_all(PASSWORD_PATTERN,$password,$passwordMatches);
    
    if (empty($usernameMatches)){
        echo("Bad characters in username<br />");
    }
    
    if (empty($passwordMatches)){
        echo("Bad characters in password<br />");
    }
    

    BTW:只需使用preg_match()代替preg_match_all()即可简化您的代码。像这样的东西应该和你的代码一样:

    /*Username and Password Patterns*/
    define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
    define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");
    
    if (!preg_match(USERNAME_PATTERN, $username)) {
        echo("Bad characters in username<br />");
    }
    if (!preg_match(PASSWORD_PATTERN, $password)) {
        echo("Bad characters in password<br />");
    }
    

答案 1 :(得分:2)

使用此:

define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");

目前,您只允许使用单字符用户名和密码。您也忘记了通过/(或其他字符)封装正则表达式。 (诚​​然,这是特定于PHP和其他一些语言的。)我还添加了^和$,以便匹配整个输入字符串。

顺便问一下,为什么还要检查密码呢?例如,只需要一定的最小长度(但完全没有检查安全性):

define("PASSWORD_PATTERN","/^.{6,}$/");

另外,我不明白你使用preg_match_all的原因。 preg_match应该也可以,并且可能更容易使用:

if (!preg_match(USERNAME_PATTERN, $username) {
    echo("Bad characters in username<br />");
}

答案 2 :(得分:1)

  

不知道它有什么问题。它假设检查用户名是否包含除a-z,A-Z,0-9,短划线,星号,下划线和句点之外的任何内容。密码与用户名相同。

如果传递的用户名/密码有效,您应该检查。你需要这种模式。 /^[\-\*\w\d\.]{6,12}$/,此处最小和最大长度分别为6和12。

define('PATTERN', '/^[\-\*\w\d\.]+$/');
if(preg_match(PATTERN, $username)){
// username is correct
} else {
// username is wrong.
}

密码相同。

答案 3 :(得分:1)

在回答之前我会说通过提出这个问题,我怀疑你是直接将密码保存为明文。这不是一个好的解决方案,因为它暴露了您的用户密码。围绕here讨论了如何以更安全的方式执行此操作的示例。

除非您正在处理某些遗留系统,否则在大多数情况下,无效字符(密码中)的问题不会成为问题。原因是您不会存储实际密码,而只会存储生成的哈希

回到你的问题。我喜欢的另一种选择是检查任何无效字符的前置。通过向字符列表添加^,您将匹配除列表之外的任何其他字符。

define("USERNAME_PATTERN","/[^*_a-z0-9A-Z.-]/");
if(preg_match(USERNAME_PATTERN, $username))
    echo 'Bad characters in username';