为什么这个PHP不会验证?

时间:2010-04-12 02:01:18

标签: php regex login validation

<?php
$username = "@#*(#(*#($&*#$";

if (preg_match("/^[0-9a-z-A-Z-_@ !]*/", $username)) 
{
   echo "true";
} else {
   echo "false";
}
?>

6 个答案:

答案 0 :(得分:2)

正如所写,正则表达式将匹配字符串开头的零个或多个列出的字符 - 这意味着无论输入字符串中的内容是什么,它总是会成功。如果要将输入限制为仅包含这些字符,则需要将其锚定在两端:

'/^[0-9a-zA-Z_@ !-]*$/'

但要注意它仍会匹配一个空字符串;如果您想阻止这种情况,您应该将*更改为+

注意我是如何删除两个连字符并在字符类的末尾添加一个连字符。因为连字符在字符类中具有特殊含义,所以当你想要字面上匹配时,你应该尽可能清楚。你可以通过用反斜杠转义它,或者把它放在第一个或最后一个位置来做到这一点。

你的正则表达式中的“额外”连字符实际上被视为字面连字符,因为它们不能形成范围 - 在每种情况下前面的字符已经是范围的一部分。但是,依靠这种行为并不是一个好主意;并非所有的正则表达式都像PHP一样宽容。当然,对于阅读代码的人来说,看起来像一样。

答案 1 :(得分:1)

此处存在问题:Z-_,因为有-,表示“从z_的字符。 正确的正则表达式为/^[0-9a-zA-Z\-_@ !]*/,反斜杠-

答案 2 :(得分:1)

两件事:

    {li>

    -中的[...]是一个特殊字符,表示范围并需要转义;以及

  1. \w[A-Za-z0-9_]的快捷方式。你应该使用它(虽然不使用它在技术上不是问题)。

  2. 所以:

    if (preg_match('/^[\w\-@ !]*/', $username))
    

答案 3 :(得分:1)

问题在于在正则表达式中使用-。此外,您可能希望正则表达式匹配整个字符串,因此您还应该放置字符串结束标记。

if(preg_match('/^[0-9a-zA-Z\-_@ !]*$/', $username)

答案 4 :(得分:0)

您可能打算将您的插入符号放在方括号内部,如此

if (preg_match("/[^0-9a-z-A-Z-_@ !]*/", $username)) 

答案 5 :(得分:0)

您需要指定字符串的结尾。否则,即使是零次重复的字符类(导致正则表达式等同于^)也会匹配任何字符串:

/^[0-9a-z-A-Z-_@ !]*$/