繁体   English   中英

PHP preg_match_all模式

[英]PHP preg_match_all pattern

我在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]");

我不知道这是怎么回事。 它假设检查用户名是否具有az,AZ,0-9,破折号,astrisk,下划线和点号以外的任何内容。 密码与用户名相同。

这是我用来检查的代码:

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

密码是一样的。

您的代码有几个问题。

  1. 您的正则表达式仅匹配一个字符。
  2. 正则表达式中没有开始和结束锚。
  3. 确保在调用preg_match_all()之前实例化preg_match_all()数组
  4. 您的正则表达式应包含/ (或其他有效字符)。
  5. 通过检查数组是否为空来检查不匹配项,而不是通过检查数组是否等于零来进行检查。 php中有很多类型/值检查陷阱,最好避免使用。

尝试这个:

/*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 />");
}

顺便说一句:您的代码可以通过简单地使用简化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 />");
}

用这个:

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 />");
}

不知道这是怎么回事。 它假设检查用户名是否具有az,AZ,0-9,破折号,astrisk,下划线和点号以外的任何内容。 密码与用户名相同。

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

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

密码相同。

在回答之前,我只是想问一下这个问题,我怀疑您是将密码直接保存为明文。 这不是一个好的解决方案,因为它会公开您的用户密码。 此处围绕该主题进行了讨论,并提供了有关如何以更安全的方式执行此操作的示例。

另外,在大多数情况下,除非您使用某些旧系统,否则无效字符(密码)的问题将不会成为问题。 这样做的原因是您将不会存储实际的密码,而只会存储生成的哈希

回到您的问题。 我喜欢的一种替代方法是检查是否存在无效字符。 通过添加^到的字符,你会比匹配列表之外的任何字符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM