Preg_Match。空间和@?

时间:2014-02-13 18:38:48

标签: preg-match

有人可以告诉我,这段代码有什么问题:

if ((!preg_match("[a-zA-Z0-9 \.\s]", $username)) || (!preg_match("[a-zA-Z0-9 \.\s]", $password)));
exit("result_message=Error: invalid characters");
} 

...

1 个答案:

答案 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:

  • PHP中的正则表达式模式必须由分隔符括起来,最常用的是/,但正如您所看到的,我选择了~。示例:/[a-zA-Z \.\s]/
  • 字符类很奇怪,因为它包含空格和包含空格的字符类\s。 IMO,要检查用户名或密码,您只需要空格,为什么不是标签,而不是回车符或换行符!您可以删除\s并释放空格,也可以使用与所有水平空格匹配的\h字符类。 /[a-zA-Z\h\.]/ (如果您不想允许标签,请用空格替换\h
  • 点在字符类中没有特殊含义,不需要转义:/[a-zA-Z\h.]/
  • 您正在尝试验证整个字符串,但您的模式与单个字符匹配!换句话说,模式只检查字符串是否至少包含一个alnum,一个空格或一个点。如果要检查所有字符串,则必须使用量词+和锚点作为字符串的开始^和结束$。示例∕^[a-zA-Z0-9\h.]+$/
  • 很好,您可以使用不区分大小写的修饰符i缩短字符类:/^[a-z0-9\h.]+$/i

但是有一种更快的方法,而不是使用!取消preg_match断言,并测试所有字符是否都在你想要的字符范围内,你只能测试是否有一个你不想要的字符字符串。要做到这一点,您只需要在第一个位置插入^来否定字符类:

preg_match('/[^a-z0-9\h.]/i', ...

(请注意,^在字符类的内部和外部具有不同的含义。如果^不在字符类的开头,则它是一个简单的文字字符。 )

相关问题