[英]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 />");
}
密码是一样的。
您的代码有几个问题。
preg_match_all()
之前实例化preg_match_all()
数组 /
(或其他有效字符)。 尝试这个:
/*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.