PHP预匹配所有模式
我在php中使用preg_match_all来检查用户名和密码中的字符,然后再将它们添加到数据库中,但我似乎无法让它以我想要的方式工作。以下是我现在拥有的:PHP预匹配所有模式,php,regex,preg-match,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*/
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、破折号、astrick、下划线和句点以外的内容。密码与用户名相同
以下是我用来检查的代码:
if ($usernameMatches == 0){
echo("Bad characters in username<br />");
}
密码相同。请使用以下密码:
define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");
目前,您只允许使用单字符用户名和密码。此外,您还忘记了用/或其他字符封装正则表达式。诚然,这是PHP和其他一些语言特有的。我还添加了^和$,以便匹配整个输入字符串
顺便问一下,为什么还要检查密码呢?例如,只需要一定的最小长度,但根本不需要检查安全性:
define("PASSWORD_PATTERN","/^.{6,}$/");
还有,我不明白你为什么要用preg_match_all。preg_匹配也应该这样做,并且可能更容易使用:
if (!preg_match(USERNAME_PATTERN, $username) {
echo("Bad characters in username<br />");
}
使用以下命令:
define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");
目前,您只允许使用单字符用户名和密码。此外,您还忘记了用/或其他字符封装正则表达式。诚然,这是PHP和其他一些语言特有的。我还添加了^和$,以便匹配整个输入字符串
顺便问一下,为什么还要检查密码呢?例如,只需要一定的最小长度,但根本不需要检查安全性:
define("PASSWORD_PATTERN","/^.{6,}$/");
还有,我不明白你为什么要用preg_match_all。preg_匹配也应该这样做,并且可能更容易使用:
if (!preg_match(USERNAME_PATTERN, $username) {
echo("Bad characters in username<br />");
}
您的代码有几个问题 您的正则表达式只匹配一个字符。 正则表达式中没有开始和结束锚。 确保在调用之前实例化匹配数组 您的正则表达式应该用/或其他有效字符包围。 通过检查数组是否为空,而不是通过检查数组是否等于零来检查不匹配。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 />");
}
您的代码有几个问题 您的正则表达式只匹配一个字符。 正则表达式中没有开始和结束锚。 确保在调用之前实例化匹配数组 您的正则表达式应该用/或其他有效字符包围。 通过检查数组是否为空,而不是通过检查数组是否等于零来检查不匹配。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 />");
}
我不知道这是怎么回事。它假设检查用户名是否有a-z、a-z、0-9、破折号、astrick、下划线和句点以外的内容。密码与用户名相同
您应该检查传递的用户名/密码是否有效。你需要这个图案/^[\-\*\w\d\.]{6,12}$/,此处最小和最大长度分别为6和12
define('PATTERN', '/^[\-\*\w\d\.]+$/');
if(preg_match(PATTERN, $username)){
// username is correct
} else {
// username is wrong.
}
密码也一样
我不知道这是怎么回事。它假设检查用户名是否有a-z、a-z、0-9、破折号、astrick、下划线和句点以外的内容。密码与用户名相同
您应该检查传递的用户名/密码是否有效。你需要这个图案/^[\-\*\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';
在回答之前,我只想说,通过问这个问题,我怀疑您正在将密码直接保存为明文。这不是一个好的解决方案,因为它会暴露您的用户密码。围绕这一点进行了讨论,并举例说明如何以更安全的方式实现这一点 另外,密码中的无效字符问题在大多数情况下都不会成为问题,除非您处理的是一些遗留系统。原因是您不会存储实际密码,而只存储生成的哈希 回到你的问题上来。我喜欢的另一种选择是检查任何无效字符的前序。通过将^添加到字符列表中,您将匹配列表以外的任何字符
define("USERNAME_PATTERN","/[^*_a-z0-9A-Z.-]/");
if(preg_match(USERNAME_PATTERN, $username))
echo 'Bad characters in username';
你为什么要这么做
密码严格吗?无论如何,您只存储它们的散列。为什么要限制密码?无论如何,您只存储它们的散列。好的,谢谢。我可能只会限制密码的长度。为什么要限制密码的长度?希望您没有将密码存储在明文中;您应该计算存储在数据库中的密码散列。即使这样,现在也被认为是不安全的;咸哈希是一种方法。我正在加密密码。我也在加盐。我真的不知道我第一次这么做的时候脑子里在想什么。谢谢大家的帮助!有谁能给我指一个好的网站来学习如何主要为PHP创建模式吗?好的,谢谢。我可能只会限制密码的长度。为什么要限制密码的长度?希望您没有将密码存储在明文中;您应该计算存储在数据库中的密码散列。即使这样,现在也被认为是不安全的;咸哈希是一种方法。我正在加密密码。我也在加盐。我真的不知道我第一次这么做的时候脑子里在想什么。谢谢大家的帮助!有人能给我指出一个学习如何主要为PHP创建模式的好网站吗?现在不能测试,但你不需要逃逸。、*和-?@Joachim Isaksson:没有。点和星在字符类中不是元字符。如果负号位于字符类的第一个或最后一个位置,则它不是字符类中的范围元字符。谢谢,我已更改为preg_match,我使用您的方式,因为这样做确实更容易。@legobear154:不客气。请单击答案左侧的复选标记,将我的答案标记为正确。@Asah我不确定我们的答案中哪一个更好,但无论如何我都投了你的票。你的努力当然应该得到超过0票。0.现在不能测试,但你不也需要逃跑吗?,*和-?@Joachim Isaksson:不。点和星在角色类中不是元字符。如果负号位于字符类的第一个或最后一个位置,则它不是字符类中的范围元字符。谢谢,我已更改为preg_match,我使用您的方式,因为这样做确实更容易。@legobear154:不客气。请单击答案左侧的复选标记,将我的答案标记为正确。@Asah我不确定我们的答案中哪一个更好,但无论如何我都投了你的票。你的努力当然应该得到超过0票。0.o