2

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

$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”等的东西。

4

3 回答 3

1

使用\b$word\b而不是\s$word\s也将匹配标点符号或字符串的开头/结尾包围的单词。(从技术上讲,\b是一个零宽度断言,它匹配单词和非单词字符之间的边界。)

当然,这仍然不能解决斯肯索普问题

于 2011-10-17T19:40:17.150 回答
0

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

于 2011-10-17T19:11:38.417 回答
0

你会想要\s+去掉你的正则表达式查询的每一边。

在旁注中,为什么不使用 strpos() 代替?

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

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

于 2011-10-17T19:17:25.390 回答