使用 preg_match 检查多个 $_POST

Check multiple $_POST with preg_match

关于检查我的多个输入(用户名、密码和验证码)preg_match 函数的正确格式的小问题

基本上代码适用于所有三个输入,但我不确定 "correct" 使用 ist 的方式。我只想知道 ,$var1 or $var2 or $var3,$var1 ,$var2 ,$var3

之间是否存在差异

它适用于两种代码,所以我有点困惑,如果一个是 "better" 或者这无关紧要。或者一个是更"cleaner"的版本。

if(isset($_GET['login'])) {
    if(!preg_match("/^[a-zA-Z._ ]{1,12}$/",$_POST['username'] ,$_POST['password'] ,$_POST['captcha_code'])) {
        die();
        } 

另一个工作代码是:

if(isset($_GET['login'])) {
    if(!preg_match("/^[a-zA-Z._ ]{1,12}$/",$_POST['username'] or $_POST['password'] or $_POST['captcha_code'])) {
        die();
        } 

嗯,$var1 or $var2 or $var3显然是完全错误的。您不能 or 字符串并期望得到不错的结果。在大多数情况下,结果将是 true,这不是您想要的。

这让我怀疑你的说法:"Its working with both codes"。

是的,如果我查看 preg_match 的手册,很明显它不接受用逗号分隔的多个主题。

所以两个版本都不工作

最重要的是一个更普遍的问题。您正在尝试使用 preg_match() 将变量的可能内容限制在 "a-zA-Z._" 中的 1 到 12 个字符之间。那是非常有限制的。像这样限制用户名和密码被认为是不好的做法

你也只是 die(); 当没有找到模式匹配时,这对用户来说不是很有用。

所以"cleaner"版本是省去了这段代码。

抱歉,我不能更积极...也许提示会有所帮助?

看看filter_input(),这是我现在用来过滤输入的。

要用一种模式匹配三个字符串,您可以试试这段代码。

$pattern = "/^[a-zA-Z._ ]{1,12}$/";
if(!preg_match($pattern, $_POST['username'])
   or !preg_match($pattern, $_POST['password'])
   or !preg_match($pattern, $_POST['captcha_code'])) {
   die();
} 

另一种方法是使用 foreach 循环:

foreach ( ['username','password','captcha_code'] as $key ) {
    if ( !preg_match("/^[a-zA-Z._ ]{1,12}$/", $_POST[$key]) ) {
        die();
    }
}