Preg_Match结果错误

时间:2013-09-25 16:22:46

标签: php regex preg-match

好的,所以我正在使用登录系统,我正在努力防止我不想要的用户输入,我的部分验证是确定用户名只是字母数字,以及密码,以及作为电子邮件的单独验证。所以我在php.net上找到了几个例子,因为在php中的所有东西中,这些preg匹配的东西对我来说根本就没有意义。

我遇到的问题是误报。前两个在true时返回false,并且电子邮件验证按预期工作,但对于我的生活,我不知道为什么。我可以简单地删除!在前面强制我的表达式的预期答案,但我实际上想知道为什么两个结构几乎完全相同的语句返回不同的布尔值。

<?php
$user = "testing2";
$pass = "testing1";
$email = "testing@gmail.com";
    if (!preg_match('/[^A-Za-z0-9]+/', $user)) {
        echo "Username must only contain English letters and numbers<br />";
    }
    if (!preg_match('/[^A-Za-z0-9]+/', $pass)) {
        echo "passw must only contain English letters and numbers<br />";
    }
    if (!preg_match('/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])*(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*$/i', $email)) { 
        echo "Please use a valid email"; 
    }
?>

2 个答案:

答案 0 :(得分:2)

因为你有一个用户名和密码的否定字符类,你应该删除条件的否定:

if (preg_match('/[^A-Za-z0-9]/', $user)) { ... }

以上意思是“如果$user包含任何不是字母数字的字符”,那么您似乎就是要警告的内容。换句话说,您的前2个正则表达式实际上是表示无效值。

混淆可能是因为^被用来否定前2个正则表达式中的字符类,但被用作电子邮件正则表达式中的锚点(字符串的开头)。

另一种方法是使前2个正则表达式与最后一个一致,并让它们只查找有效值:

if (!preg_match('/^[A-Za-z0-9]+$/', $user)) { ... }

以上内容确保$user的每个字符都是字母数字。

答案 1 :(得分:0)

你可以做两件事:

寻找正确的格式; 如果不是字符串只是字母数字字符

if (!preg_match('/[A-Za-z0-9]+/', $user)) 

寻找不正确的格式; 如果字符串包含非字母数字字符

if (preg_match('/[^A-Za-z0-9]/', $user))

你把它们混合在一起!