【问题标题】:Blacklisting words that can be entered into a MySQL database via a php form using regex使用正则表达式通过 php 表单将可以输入 MySQL 数据库的单词列入黑名单
【发布时间】:2011-10-17 19:04:00
【问题描述】:

好的,目前在我的网站上,我有一个将单词列入黑名单的功能,如果在提交表单时检测到它们,则帖子没有提交,这里是:

$disallowedWords = array(
'list','of','bad','words'
);

foreach ($disallowedWords as $word) {
  if (preg_match("/\s+$word\s+/i", $entry)) {
    die('The word or phrase ' . $word . ' is not allowed...');
  }
}

$urlRegex = '(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*';
if (preg_match($urlRegex, $entry)) {
  die('The word or phrase ' . $word . ' is not allowed...');

} 

这适用于这样的句子:

这是一个列表

它会停止发帖并说不允许使用单词列表,但是如果我输入:

这是一个列表

这里是列表

它不起作用,那么,我如何(如果可能的话)让它审查那个确切的字母组合?或者任何会导致我无法输入“listt”或“alist”等的方法。

【问题讨论】:

标签: php mysql regex blacklist


【解决方案1】:

使用\b$word\b 代替\s$word\s 也会匹配标点符号或字符串开头/结尾的单词。 (从技术上讲,\b 是一个匹配单词和非单词字符之间边界的zero-width assertion。)

当然,这仍然解决不了Scunthorpe problem

【讨论】:

    【解决方案2】:

    从您的正则表达式中删除两个 '\s+' 实例可以满足您的要求,但它也会将任何(可能有效的)包含“坏词”的词列入黑名单

    【讨论】:

    • 效果很好,我明白你的意思,这就是为什么只有非常具体的词才会出现在没有 \s+ 的黑名单上,而其他不那么令人反感的词会出现在原文上。
    • 我希望没有人在您的网站上发表关于香菇的话题。
    【解决方案3】:

    您可能希望将\s+ 从您的正则表达式查询的每一侧删除。

    顺便说一句,为什么不使用 strpos() 呢?

    http://php.net/manual/en/function.strpos.php

    或者更好的是,如果找到列入黑名单的单词,而不是停止它们,只需将每个列入黑名单的单词替换为 **** 或其他东西。

    【讨论】:

    • 我试过 strpos() - 它是特定的(见:stackoverflow.com/questions/7780631/…)即使我写的代码正确,它也不会起作用
    • @Aviate,我不知道你在说什么。 strpos() 非常适合您正在尝试做的事情。 if (strpos($entry, $word) !== false) echo 'You cannot use the word' . $word;
    猜你喜欢
    • 2017-09-24
    • 2011-11-04
    • 2021-05-06
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多