【问题标题】:php regex syntax to whitelist alphanumeric [closed]将字母数字列入白名单的php正则表达式语法[关闭]
【发布时间】:2014-08-07 23:11:58
【问题描述】:

我正在尝试使用 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";
}

返回“确定”。换句话说,它让 karl# 通过。我希望它返回错误消息。

我是在滥用预赛还是我做错了什么?感谢您的任何建议。

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

【问题讨论】:

  • 我在尝试时收到错误消息。
  • 错误信息也会出现在我面前..
  • 请发布遇到问题的实际代码。您发布的内容应该可以正常工作。
  • 杰夫和乔尔你们在哪里? michael.richter.name/blogs/…

标签: php regex whitelist


【解决方案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

【讨论】:

  • 这将允许除字母数字之外的下划线。
  • @Barmar 好眼力,感谢您的指出。刚才提到了
  • 好的,现在你所做的只是将0-9 缩写为\d,保存一个字符。虽然这在风格上可能会更好,但你为什么认为它会解决他的问题?他的原始代码也适用于其他所有人。不管他的问题是什么,它不在问题的代码中。
  • @Barmar 正则表达式的关键是m(多行)标志
  • 为什么有必要这样做?输入只是一行。
【解决方案2】:

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

工作版本

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

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

【讨论】:

  • ^ 没有被用作not 字符,它被用作beginning-of-line 锚。
  • 1.表达式无效。 2. 你有双重否定。
  • @Barmar ^ 在字符掩码内反转它。
  • @Cobra_Fast 为什么表达式无效?
  • @Barmar 因为 PHP 要求您有开始和结束分隔符。 php.net/manual/en/regexp.reference.delimiters.php
猜你喜欢
  • 2014-01-09
  • 2020-04-15
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2021-11-26
相关资源
最近更新 更多