【问题标题】:Detect and edit external links检测和编辑外部链接
【发布时间】:2011-10-14 18:27:09
【问题描述】:

我想说我知道关于 SO 的类似问题,但由于我的情况略有不同,我认为最好提出一个新问题。我确实搜索了一个小时,我可能错过了一些东西,如果是这样,请原谅我。

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

我需要

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

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

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

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

可以请一些有此任务经验的专家指出正确的方向吗?

【问题讨论】:

    标签: php jquery regex url


    【解决方案1】:

    是的,这绝对是您想要在服务器端执行的操作。首先,如果您接受包含 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 很好地解释了这一点。我们基本上只是查找每个&lt;a ... href=""&gt; 标签,抓取它的内容,如果它以(anything):// 开头,则重新格式化它,然后重复直到$text 中没有更多链接。如果你重新格式化链接,你需要rawurlencode()你抓取的链接,以确保新链接是valid

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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多