Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP预匹配所有模式_Php_Regex_Preg Match - Fatal编程技术网

PHP预匹配所有模式

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*/

我在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、破折号、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