PHP-从消息中删除http/www(主机域除外)以禁用可点击链接



我有一个简单的留言板,比如说: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示例:

$message BEFORE:

你好,世界,感谢http://mywebsite/about我学到了很多。我发现你在http://www.bing.com,https://google.com/search以及一些www.spamwebsite.com/refid=spammer2。

$message AFTER:

你好,世界,感谢http://mywebsite.com/about我学到了很多。我在bing.com、google.com/search和一些垃圾邮件网站上找到了你。


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

$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

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.)[^"rn]+"|'(?:(?:https?|ftp|file)://|www.|ftp.)[^'rn]+')/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.txtftp://spamftp.com/file.exe


输出:

你好,多亏了(SPAM),我学到了很多。我在上找到你了http://www.bing.com,https://google.com/search以及一些(SPAM)。(SPAM)


演示:

http://ideone.com/9IxFrB

如果你想保留链接的文本,但使其"不可点击",你可以尝试以下代码:

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

编码板

对于任何想要答案的人,我发布了一个相关的(更具体的)问题,解决了这个问题:PHP-从字符串中删除不以特定单词开头的单词(http|https|www|.com|.net)

相关内容

  • 没有找到相关文章

最新更新