当前位置: 首页 > 知识库问答 >
问题:

PHP-从消息中删除超文本传输协议/www(主机域除外)以禁用可点击链接

暴绪
2023-03-14

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

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

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

问题-有太多的垃圾邮件。所以我的想法是自动删除上面的超文本传输协议|s/www,这样这些就不会成为“可点击的链接”然而,我想让海报链接到我的网站内的页面,即不删除超文本传输协议|s/www当消息包含链接/s到mywebsite.com.

我的想法是创建两个阵列:

$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');

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

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

$message之前:

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

$消息后:

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

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

共有3个答案

常元章
2023-03-14

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

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

代码板

龚俭
2023-03-14

killSpam()功能特点:

  • 适用于单引号和双引号。
  • 无效的html
  • ftp://
  • 超文本传输协议
  • 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;

我不能在这里发布垃圾邮件超文本标记语言,我想它是自己的裁垃圾邮件()...-查看它在http://pastebin.com/HXCkFeGn

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

你好,世界,感谢(垃圾邮件)我学到了很多。我找到你了http://www.bing.com, https://google.com/search 还有一些(垃圾邮件)。(垃圾邮件),(垃圾邮件),(垃圾邮件)和(垃圾邮件),(垃圾邮件)(垃圾邮件)

http://ideone.com/9IxFrB

伯丁雷
2023-03-14
$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

 类似资料:
  • 我试图禁用我的AngularJS应用程序中的缓存,但它无法使用以下代码: 当我使用

  • 我了解Prorobuf/Steft需要独特的数字字段标记来提供版本兼容性。他们通过以下方式序列化消息(某种)来提供版本兼容性: <代码> 反序列化时,他们拾取标签值,查找消息模式,并知道将值填充到哪个字段中。这样,只要我们添加具有不同标签值的新字段,消息就会兼容。 但我认为这不是一个很好的设计: > 标签值必须在消息中编码。这有一些开销。 例如当客户端多次调用远程服务器上的RPC方法时,每个请求/

  • 我是新的Kafka,我试图通过超文本传输协议从外部应用程序发布数据,但我找不到这样做的方法。 我已经在kafka中创建了一个主题,并对其进行了测试,以生成和使用消息,但我不知道如何通过http插入/发布消息,我尝试调用以下url来检索主题,但它没有检索任何数据http://servername:2181/topics/ 我使用的是cloudera 5.12.1。

  • 在owncloud相关网站和stackoverflow自身的以下链接中,所有相关信息都以不完整的形式呈现: 用户配置Api-Owncloud 我试着做一些非常简单的事情: > 我得到这样的输出: 开始处理凭据,首先它将存储在本地变量中 Hello Frank 您的密码是frankspassword failure 997未经授权 在owncloud中创建了一个新用户 我还尝试使用以下php脚本登录

  • 向源生成特殊的clear-message,这将导致聚合的消息变为空 将消息直接写入具有空数据的中间主题 另一种方式,也许kafka-streams已经有一个API调用了? 加分问题:如果我知道我不想让消息坐在中间话题中的时间超过6个月,我可以指示kafka-streams创建6M留存的中间话题,还是在我运行App之前我自己手动创建话题?

  • 我尝试使用以下方法从Api获取json数据 我将这个物体建模如下 数据如下: 当我尝试使用模型访问时,我收到错误“\u InternalLinkedHashMap”