9

我有一个简单的留言板,比如说:mywebsite.com,它允许用户发布他们的消息。目前,董事会使所有链接都可点击,即。当有人发布以以下开头的内容时:

http://, https://, www., http://www., https://www.

然后脚本自动将它们作为链接(即添加 A href.. 标记)。

问题 - 垃圾邮件太多。所以我的想法是自动删除上面的http|s/www,这样它们就不会变成“可点击的链接”。但是,我想允许海报链接到我网站内的页面,即。当消息包含指向 mywebsite.com 的链接时,不要删除 http|s/www。

我的想法是创建两个数组:

$removeParts = array('http://', 'https://', 'www.', 'http://www.', 'https://www.');

$keepParts = array('http://mywebsite.com', 'http://www.mywebsite.com', 'www.mywebsite.com', 'http://mywebsite.com', 'https://www.mywebsite.com', 'https://mywebsite.com');

但我不知道如何正确使用它们(可能 str_replace 可以以某种方式工作)。

以下是发布前和发布后的 $message 示例:

$之前的消息:

世界你好,感谢http://mywebsite/about我学到了很多东西。我在http://www.bing.comhttps://google.com/search和一些www.spamwebsite.com/refid=spammer2上找到了你。

$消息之后:

世界你好,感谢http://mywebsite.com/about我学到了很多东西。我在 bing.com、google.com/search 和一些 spamwebsite.com/refid=spammer2 上找到了你。


请注意,用户在帖子表单中输入了明文,因此脚本只能使用此明文(而不是 href 等)。

4

4 回答 4

1
$url = "http://mywebsite/about";
$parse = parse_url($url);

if($parse["host"] == "mywebsite")
    echo "My site, let's mark it as link";

更多信息: http: //php.net/manual/en/function.parse-url.php

于 2015-04-24T23:24:05.897 回答
1

killSpam()功能特点:

  • 适用于单引号和双引号。
  • 无效的 html
  • ftp://
  • http://
  • https://
  • 文件://
  • 邮寄:

function killSpam($html, $whitelist){

//process html links
preg_match_all('%(<(?:\s+)?a.*?href=["|\'](.*?)["|\'].*?>(.*?)<(?:\s+)?/(?:\s+)?a(?:\s+)?>)%sm', $html, $match, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($match[1]); $i++) {
    if(!preg_match("/$whitelist/", $match[1][$i])){
        $spamsite = $match[3][$i];
        $html = preg_replace("%" . preg_quote($match[1][$i]) . "%",  " (SPAM) ", $html);
    }
}

//process cleartext links
preg_match_all('/(\b(?:(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[A-Z0-9+&@#\/%?=~_|$!:,.;-]*[A-Z0-9+&@#\/%=~_|$-]|((?:mailto:)?[A-Z0-9._%+-]+@[A-Z0-9._%-]+\.[A-Z]{2,6})\b)|"(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^"\r\n]+"|\'(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^\'\r\n]+\')/i', $html, $match2, PREG_PATTERN_ORDER);

for ($i = 0; $i < count($match2[1]); $i++) {
     if(!preg_match("/$whitelist/", $match2[1][$i])){
        $spamsite = $match2[1][$i];
        $html = preg_replace("%" . preg_quote($spamsite) . "%",  " (SPAM) ", $html);
    }
}


return $html;

}

用法:

$html = <<< LOB
 <p>Hello world, thanks to <a href="http://mywebsite.com/about" rel="nofollow">http://mywebsite/about</a> I learned a lot. I found
  you on <a href="http://www.bing.com" rel="nofollow">http://www.bing.com</a>, <a href="https://google.com/search" rel="nofollow">https://google.com/search</a> and on some <a href="http://www.spamwebsite.com" rel="nofollow">www.spamwebsite.com/refid=spammer2< /a >. www.spamme.com, http://morespam.com/?aff=122, http://crazyspammer.com/?money=22 and spam@email.com, file://spamfile.com/file.txt ftp://spamftp.com/file.exe </p>
LOB;

$whitelist = "(google\.com|yahoo\.com|bing\.com|nicesite\.com|mywebsite\.com)";

$noSpam = killSpam($html, $whitelist);

echo $noSpam;

垃圾邮件示例:

我无法在此处发布垃圾邮件 HTML,我猜有自己的 killSpam()...- 在http://pastebin.com/HXCkFeGn查看它

世界你好,感谢 http://mywebsite/about 我学到了很多东西。我在 http://www.bing.com、https://google.com/search 和一些 www.spamwebsite.com/refid=spammer2 上找到了你。www.spamme.com、http://morespam.com/?aff=122、http://crazyspammer.com/?money=22 和 spam@email.com、file://spamfile.com/file.txt ftp ://spamftp.com/file.exe


输出:

世界你好,感谢(SPAM)我学到了很多东西。我在http://www.bing.comhttps://google.com/search和一些 (SPAM) 上找到了你。(SPAM) , (SPAM) , (SPAM) 和 (SPAM) , (SPAM) (SPAM)


演示:

http://ideone.com/9IxFrB

于 2015-04-24T23:38:41.640 回答
0

对于任何寻找答案的人 - 我发布了一个相关的(更具体的)问题来解决这个问题:PHP - remove words (http|https|www|.com|.net) from string that do not start with specific words

于 2015-04-27T03:31:49.410 回答
0

如果你想保留链接的文本,但让它们“不可点击”,你可以试试这个代码:

<?php

$text = <<<__text
   Hello world, thanks to http://mywebsite/about I learned a lot.
   I found you on http://www.bing.com, https://google.com/search and on some www.spamwebsite.com/refid=spammer2.
   www.spamme.com, http://morespam.com/?aff=122, http://crazyspammer.com/?money=22 and spam@email.com, file://spamfile.com/file.txt ftp://spamftp.com/file.exe
__text;
$allowed_domains = ['mywebsite.com'];

$pattern = "/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/";
preg_match_all($pattern, $text, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
    list(, $url, $scheme_and_domain, $scheme, $path) = $m;
    $domain = preg_replace(['/^' . preg_quote($scheme, '/') . '/i', "/^www./i"], '', $scheme_and_domain);

    if (in_array($domain, $allowed_domains)) continue;

    $url_prepared = rtrim("$domain$path", '/');
    $text = str_replace($url, $url_prepared, $text);
}

echo $text;

键盘

于 2015-04-25T02:33:59.317 回答