php - 为什么这个 PHP 无法验证?

标签 php regex authentication validation

<?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/

相关文章:

asp.net-mvc-4 - 使用 ASP.NET MVC 进行基于声明的授权

php - Linux Change 文件的修改日期?

php - Paypal 订阅 IPN 自定义变量

javascript - 正则表达式匹配javascript中的特定字符串

python - 在 python 中使用 re.findall() 的问题

java - 从字符串中提取所有 <xxxx> 标签

linux - 从服务器远程连接到 Dropbox 服务

javascript - 将数据从 PHP 传递到 JS : in cases of displaying huge amounts of data

php - 删除点和斜线正则表达式 - 非相对

php - Laravel 5.1 - 如何在 AuthController 中设置登录路径?