<?php
$username = "@#*(#(*#($&*#$";
if (preg_match("/^[0-9a-z-A-Z-_@ !]*/", $username))
{
echo "true";
} else {
echo "false";
}
?>
最佳答案
正如所写,该正则表达式将匹配字符串开头列出的零个或多个字符——这意味着无论输入字符串中的内容是什么,它总是会成功。如果您想将输入限制为仅这些字符,则需要将其锚定在两端:
'/^[0-9a-zA-Z_@ !-]*$/'
但请注意,它仍然会匹配空字符串;如果你想防止这种情况,你应该将 *
更改为 +
。
请注意我如何删除两个连字符并在字符类的末尾添加一个连字符。由于连字符在字符类中具有特殊含义,因此当您想要按字面匹配连字符时,应尽可能清楚地说明连字符。您可以通过使用反斜杠转义它,或者将其放在第一个或最后一个位置来实现这一点。
正则表达式中的“额外”连字符实际上被视为文字连字符,因为它们无法在其所在位置形成范围 - 在每种情况下,前面的字符已经是范围的一部分。不过,依赖这种行为并不是一个好主意。并非所有正则表达式风格都像 PHP 一样宽容。当然,对于任何阅读您的代码的人来说,它看起来都是一个错误。
关于php - 为什么这个 PHP 无法验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619492/