php正则表达式语法白名单字母数字

时间:2014-08-07 23:11:59

标签: php regex whitelist

我正在尝试使用preg_match将用户名列入白名单字符并将其屏蔽掉,但是代码并不像我喜欢的那样

这是:

PHP

$username = "karl#";
if (!preg_match("#^[a-zA-Z0-9]+$#", $username))
{
$msg = "You may not use special characters in your username";
}
else {
$msg = "ok";
}

返回"确定"。换句话说,它让卡尔#通过。我希望它返回错误信息。

我是否误用了比赛或我做错了什么?感谢您的任何建议。

编辑:上面的代码确实有效。错误是因为在原始版本中我没有对用户名进行硬编码,而是将其作为帖子进行处理,并且发布时出现问题。我使用^ \ w + $接受了下面的答案,因为它允许使用下划线并且更简洁。还要感谢评论中包含的正则表达式的所有优点。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

^\w+$

<强> Working demo

正如Barmar在评论中指出的那样,这也会允许下划线,但如果你不想要它们,那么你的正则表达式就可以了:

^[a-zA-Z0-9]+$

你需要用标志来帮助正则表达式:

$re = "/^[a-zA-Z0-9]+$/m"; 
$username = "karl#";   ^----Notice the multiline flag

你也可以使用:

$re = "/^[a-z0-9]+$/mi"; 
                     ^---- Case Insensitive flag

答案 1 :(得分:0)

根据评论修改,我为模式添加了分隔符:

工作版

<?php
$username = "karl";
if (preg_match("/[^a-zA-Z0-9]/", $username))
{
$msg = "You may not use special characters in your username";
}
else {
$msg = "ok";
}

echo $msg;
?>

将非字符放在范围括号内。