【问题标题】:Detecting specific words in a textarea submission检测 textarea 提交中的特定单词
【发布时间】:2011-12-08 12:00:26
【问题描述】:

我的网站上有一个新功能,用户可以通过文本区域提交任何文本(我停止了所有 HTML 条目)。我仍然遇到的主要问题是他们可以输入“http://somewhere.com”,这是我想停止的。我还想将特定单词列入黑名单。这是我之前的:

if (strpos($entry, "http://" or ".com" or ".net" or "www." or ".org" or ".co.uk" or "https://") !== true) {
            die ('Entries cannot contain links!');

但这不起作用,因为它完全阻止了用户提交任何文本。所以我的问题很简单,我该怎么做?

【问题讨论】:

  • 如果我输入 Please go to www (dot) example (dot) com 会怎样?无论如何,你不能在 strpos 函数中使用像这样的“或”列表。
  • 感谢您指出这两点。我想我会将“www”、“(dot)”、“[dot]”、 以及所有变体列入黑名单,而不会将 dot 本身列入黑名单。
  • 你在那里有效地做的就是说if (strpos($entry,'1') !== true)。这将总是评估为TRUE,因为strpos()从不返回TRUE,除了您不能以这种方式使用or这一事实之外。
  • 也看看这个帖子:stackoverflow.com/questions/1327112/… 如果我可以建议黑名单的代码行,那么它可能是echo str_replace(array('not', 'allowed'),'',"not allowed, etc etc");
  • @Melsi 如果我输入Not 会怎样?如果我输入nOt 会怎样?此外,如果我输入nothing 会怎样?我不想看起来像输入了hing...如果来自 Clitheroe 的人似乎在说他们生活在英雄中,他们不会留下深刻的印象,而斯肯索珀斯也会同样不为所动...

标签: php html forms textarea blacklist


【解决方案1】:

这是Regular Expressions 的工作。

你需要这样做:

// A list of words you don't allow
$disallowedWords = array(
  'these',
  'words',
  'are',
  'not',
  'allowed'
);
// Search for disallowed words.
// The Regex used here should e.g. match 'are', but not match 'care' or 'stare'
foreach ($disallowedWords as $word) {
  if (preg_match("/\s+$word\s+/i", $entry)) {
    die("The word '$word' is not allowed...");
  }
}

// This variable should contain a regex that will match URLs
// there are thousands out there, take your pick. I have just
// used an arbitrary one I found with Google
$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\.\,\?\'\\\+&%\$#\=~_\-]+))*';

// Search for URLs
if (preg_match($urlRegex, $entry)) {
  die("URLs are not allowed...");
}

【讨论】:

  • 完美运行,谢谢,但是,如果我输入例如 http:// 而不是 http,那么它仍然允许我发布,有什么办法吗?
  • 对不起,不太明白你在说什么,你的意思是链接匹配部分不能正常工作?老实说,正则表达式不是我最好的主题(这就是为什么我从Google 的第一个结果中捏了那个)。如果您希望有人给您一个适合您目的的正则表达式,请更新问题(或者可能作为一个新问题,因为它可能确实证明了一个问题)。您正在寻找的是“正则表达式匹配字符串中的 URL”。记得先搜索!
【解决方案2】:

一个简单的方法是将所有不允许的单词放入一个数组中并循环遍历它们以检查每个单词。

$banned = array('http://', '.com', '.net', 'www.', '.org'); // Add more
foreach ($banned as $word):
    if (strpos($entry, $word) !== false) die('Contains banned word');
endforeach;

这样做的问题是,如果你太过分了,开始禁止使用“com”或其他词,那么其他包含字母“com”的单词和短语可能是完全合法的,这会导致假阳性。您可以使用正则表达式来搜索看起来像 URL 的字符串,但是您可以像我上面所做的那样轻松地将它们分解。没有有效的方法可以完全阻止人们将链接发布到评论中。如果你不希望他们在那里,你最终只需要使用适度。社区审核效果很好,例如Stack Overflow

【讨论】:

    【解决方案3】:

    您必须多次使用 strpos。用您的方式评估 or 语句并返回 true / false 并将其传递给 strpos。

    这样它应该可以工作:

    if (strpos($entry, "http://") !== false || strpos($entry, "https://") !== false || strpos($entry, ".com") !== false)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多