有人可以告诉我,这段代码有什么问题:
if ((!preg_match("[a-zA-Z0-9 \.\s]", $username)) || (!preg_match("[a-zA-Z0-9 \.\s]", $password)));
exit("result_message=Error: invalid characters");
}
...
答案 0 :(得分:3)
有些事情是错的。我假设你要找的代码是:
if (preg_match('~[^a-z0-9\h.]~i', $username) || preg_match('~[^a-z0-9\h.]~i', $password))
exit('result_message=Error: invalid characters');
您的代码有什么问题?
模式[a-zA-Z0-9 \.\s]
由于多种原因而为false:
/
,但正如您所看到的,我选择了~
。示例:/[a-zA-Z \.\s]/
\s
。 IMO,要检查用户名或密码,您只需要空格,为什么不是标签,而不是回车符或换行符!您可以删除\s
并释放空格,也可以使用与所有水平空格匹配的\h
字符类。 /[a-zA-Z\h\.]/
(如果您不想允许标签,请用空格替换\h
) /[a-zA-Z\h.]/
+
和锚点作为字符串的开始^
和结束$
。示例∕^[a-zA-Z0-9\h.]+$/
i
缩短字符类:/^[a-z0-9\h.]+$/i
但是有一种更快的方法,而不是使用!
取消preg_match断言,并测试所有字符是否都在你想要的字符范围内,你只能测试是否有一个你不想要的字符字符串。要做到这一点,您只需要在第一个位置插入^
来否定字符类:
preg_match('/[^a-z0-9\h.]/i', ...
(请注意,^
在字符类的内部和外部具有不同的含义。如果^
不在字符类的开头,则它是一个简单的文字字符。 )的