<?php
$username = "@#*(#(*#($&*#$";
if (preg_match("/^[0-9a-z-A-Z-_@ !]*/", $username))
{
echo "true";
} else {
echo "false";
}
?>
答案 0 :(得分:2)
正如所写,正则表达式将匹配字符串开头的零个或多个列出的字符 - 这意味着无论输入字符串中的内容是什么,它总是会成功。如果要将输入限制为仅包含这些字符,则需要将其锚定在两端:
'/^[0-9a-zA-Z_@ !-]*$/'
但要注意它仍会匹配一个空字符串;如果您想阻止这种情况,您应该将*
更改为+
。
注意我是如何删除两个连字符并在字符类的末尾添加一个连字符。因为连字符在字符类中具有特殊含义,所以当你想要字面上匹配时,你应该尽可能清楚。你可以通过用反斜杠转义它,或者把它放在第一个或最后一个位置来做到这一点。
你的正则表达式中的“额外”连字符实际上被视为字面连字符,因为它们不能形成范围 - 在每种情况下前面的字符已经是范围的一部分。但是,依靠这种行为并不是一个好主意;并非所有的正则表达式都像PHP一样宽容。当然,对于阅读代码的人来说,看起来像一样。
答案 1 :(得分:1)
此处存在问题:Z-_
,因为有-
,表示“从z
到_
的字符。
正确的正则表达式为/^[0-9a-zA-Z\-_@ !]*/
,反斜杠-
。
答案 2 :(得分:1)
两件事:
-
中的[...]
是一个特殊字符,表示范围并需要转义;以及
\w
是[A-Za-z0-9_]
的快捷方式。你应该使用它(虽然不使用它在技术上不是问题)。
所以:
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-_@ !]*$/