为什么赢了';这不是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-_@ !]*$/