为什么赢了';这不是PHP验证吗?

为什么赢了';这不是PHP验证吗?,php,regex,login,validation,Php,Regex,Login,Validation,您可能打算将插入符号放在方括号内,如下所示 <?php $username = "@#*(#(*#($&*#$"; if (preg_match("/^[0-9a-z-A-Z-_@ !]*/", $username)) { echo "true"; } else { echo "false"; } ?> 这里有一个问题:Z-,因为有一个-,它的意思是“从Z到的字符”。 正确的regexp是/^[0-9a-zA-Z\-\u@!]*/,反斜杠-两件事: -内的[

您可能打算将插入符号放在方括号内,如下所示

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

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

这里有一个问题:
Z-
,因为有一个
-
,它的意思是“从
Z
的字符”。 正确的regexp是
/^[0-9a-zA-Z\-\u@!]*/
,反斜杠
-
两件事:

  • -
    内的
    […]
    是一个特殊字符,表示一个范围,需要转义;以及

  • \w
    [a-Za-z0-9\
    的快捷方式。您应该使用它(尽管不使用它在技术上不是问题)

  • 因此:


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

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

    如前所述,该正则表达式将在字符串开头匹配零个或多个列出的字符,这意味着无论输入字符串中包含什么,它都将始终成功。如果要将输入限制为仅包含这些字符,则需要在两端锚定它:

    if(preg_match('/^[0-9a-zA-Z\-_@ !]*$/', $username)
    
    但请注意,它仍将匹配空字符串;如果要防止出现这种情况,应将
    *
    更改为
    +

    请注意,我是如何删除两个连字符并在字符类末尾添加一个连字符的。因为连字符在字符类中有特殊的含义,所以当您希望逐字匹配一个连字符时,应尽可能清楚地说明这一点。您可以通过使用反斜杠对其进行转义,或者将其放置在第一个或最后一个位置来实现


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

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

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

    你的输入是什么?你期望的输出/匹配是什么?实际上。。。似乎正则表达式将匹配所有。。。o、 oIt可能也不需要
    z-A
    ——我认为这应该是
    A-zA-z
    ,这不是问题。字符类被正确解释为
    0-9
    a-z
    -
    a-z
    -
    -
    @
    ,空格,
    -
    在任何情况下都不需要转义。在这种情况下,您还可以使用
    [\w-@!]
    '/^[0-9a-zA-Z_@ !-]*$/'
    
    /^[0-9a-z-A-Z-_@ !]*$/