gpt4 book ai didi

php - 检测和编辑外部链接

转载 作者:搜寻专家 更新时间:2023-10-31 21:43:52 26 4
gpt4 key购买 nike

我想说我知道关于 SO 的类似问题,但由于我的情况略有不同,我认为最好打开一个新问题。我确实搜索了一个小时,我可能遗漏了什么,如果是这样请原谅我。

问题:我正在开发一个类似于 facebook 的功能:用户可以发布一条可能包含多个链接的文本消息,这些链接可能会或很多不会放在 anchor 标签中,并且可能具有不同的协议(protocol)(http、https , ftp,....)

我需要

  1. 检测这些链接并可能尝试检索它们(就像 facebook)。我猜这是 jquery 的任务?

  2. 我还需要可靠地检测外部链接并将它们更改为 mysite.com/external?url=thelink。我认为这是 php 的任务(因为我不能相信来自客户端的输入,对吧?)

无论如何,由于链接不能保证在 anchor 标记中,使用 dom 解析器似乎不太可靠(或者我错了)?我在网上找到了一个简单的正则表达式(顺便说一句,我对正则表达式很糟糕)我认为我可以利用它(通过添加更多协议(protocol))

$strText = preg_replace( '/(http|ftp)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/i', '<a href="\0">\4</a>', $strText );  

一些在这方面有经验的专家能给我指出正确的方向吗?

最佳答案

是的,这绝对是您想要在服务器端执行的操作。首先,如果您接受包含 HTML 标记的用户输入,您应该使用像 HTML Purifier 这样的良好 HTML 过滤器对其进行清理。 . (这也将使他们的输入更容易解析更复杂的标记。)

应该在单个 preg_replace() 语句中是可行的,但我会把它分成这样的东西:

$hrefPattern = '/<a[^>]+?href="(.+?)".*?>/i';

$outLink = 'http://mysite.com/external?url=';

$offset = 0;
while(preg_match($hrefPattern, $text, $hrefMatches, PREG_OFFSET_CAPTURE, $offset))
{

$hrefInner = $hrefMatches[1][0];
$offset = $hrefMatches[1][1];
echo $hrefInner . "\r\n";

if(strpos($hrefInner, '://') !== false)
{
$externalUrl = $outLink . rawurlencode($hrefInner);
$text = str_replace($hrefInner, $externalUrl, $text);
$offset += strlen($externalUrl);
}

}

preg_match() documentation很好地解释了这一点。我们基本上只是在查找每个 <a ... href="">标签,捕获它的内容,如果它以 (anything):// 开头,则重新格式化它, 并重复直到 $text 中不再有链接为止.如果重新格式化链接,则需要 rawurlencode()您抓取的链接以确保新链接是 valid .

Facebook 为它的链接片段抓取内容的方式,我想,比这复杂得多,但是是的 - 你会想要发送一个 AJAX 请求到一个 PHP 页面,该页面抓取相关链接并生成任何你想要的片段。不过,相当涉及的内容更多 - 如果页面不存在、重定向到另一个页面、具有无效标记、不同的文档类型等,您将不得不处理。 p>

希望对您有所帮助!

关于php - 检测和编辑外部链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6853416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com