使用PHP查找字符串中的链接。与普通链接和youtube链接不同

时间:2011-10-25 18:33:45

标签: php youtube exp

我有一个包含链接的字符串。我想让我的php用我的链接做不同的事情,具体取决于网址。

答案:

function fixLinks($text)
{       
        $links = array();
        $text = strip_tags($text);    
        $pattern = '!(https?://[^\s]+)!'; 
        if (preg_match_all($pattern, $text, $matches)) {
            list(, $links) = ($matches);
        }

        $i = 0;
        $links2 = array();
        foreach($links AS $link) {
            if(strpos($link,'youtube.com') !== false) {
                $search = "!(http://.*youtube\.com.*v=)?([a-zA-Z0-9_-]{11})(&.*)?!";
                $youtube = '<a href="youtube.php?id=\\2" class="fancy">http://www.youtube.com/watch?v=\\2</a>';
                $link2 = preg_replace($search, $youtube, $link);
            } else {
                $link2 = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\-\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank"><u>$1</u></a>', $link);
            }
            $links2[$i] = $link2;
            $i++;     
        }
        $text = str_replace($links, $links2, $text);
        $text = nl2br($text);

    return $text;
}

2 个答案:

答案 0 :(得分:2)

首先,沟渠eregi。它被弃用了,很快就会消失。

然后,在一次通过中这样做可能是一段时间。我认为你最好把它分成三个阶段。

第1阶段对您的输入运行正则表达式搜索,查找看起来像链接的所有内容,并将其存储在列表中。

阶段2 遍历列表,检查链接是否转到youtube(parse_url对此非常有用),并将合适的替换放入第二个列表。

阶段3 :您现在有两个列表,一个包含原始匹配,一个包含所需的替换。在原始文本上运行str_replace,提供搜索参数的匹配列表和替换的替换列表。

这种方法有几个优点:

  1. 提取链接的正则表达式可以保持相对简单,因为它不需要考虑特殊的主机名
  2. 调试更容易;您可以在阶段3之前转储搜索和替换数组,并查看它们是否包含您期望的内容
  3. 因为您一次性执行所有替换,所以可以避免重叠匹配或替换已替换文本的问题(毕竟,替换后的文本仍包含URL,您不想再次替换它)

答案 1 :(得分:0)

tdammers' answer很好,但另一种选择是使用preg_replace_callback。如果你继续这样做,那么这个过程会有所改变:

  1. 创建正则表达式以匹配所有链接,与第1阶段相同
  2. 在回调中,搜索YouTube视频ID。这将需要运行第二个preg_match,这是(在我看来)这项技术的最大问题。
  3. 根据是否为YouTube,返回替换字符串。
  4. 代码看起来像这样:

    function replaceem($matches) {
        $url = $matches[0];
        preg_match('~youtube\.com.*v=([\w\-]{11})~', $url, $matches);
        return isset($matches[0]) ?
            '<a href="youtube.php?id='.$matches[1].'" class="fancy">'.
            'http://www.youtube.com/watch?v='.$matches[1].'</a>' :
            '<a href="'.$url.'" title="Åben link" alt="Åben link" '.
            'target="_blank">'.$url.'</a>';
    }
    $text = preg_replace_callback('~(?:f|ht)tps?://[^\s]+~', 'replaceem', $text);