【问题标题】:Find links in string with PHP. Differ from normal and youtube links使用 PHP 在字符串中查找链接。不同于普通链接和 youtube 链接
【发布时间】:2011-10-25 18:33:45
【问题描述】:

我有一个包含链接的字符串。我希望我的 php 对我的链接做不同的事情,这取决于 url。

答案:

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

【问题讨论】:

  • 我会更加努力,并在上面投入更多的正则表达式。这通常有助于完全释放任何看不见的东西:) - 这有一个回调,所以你可以先提取所有链接,然后寻找 youtube:stackoverflow.com/questions/6861324/… - 这里是一个 youtube 正则表达式:stackoverflow.com/questions/6556559/…
  • 嗯,这只是我发现的一些测试。我愿意接受建议。谢谢

标签: php youtube exp


【解决方案1】:

首先,抛弃eregi。它已被弃用,很快就会消失。

那么,仅通过一次就完成此操作可能太过分了。我认为你最好把它分成三个阶段。

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

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

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

这种方法有几个优点:

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

【讨论】:

  • 好的,我成功了 :-) 非常感谢。请评论我的代码以进行优化。
【解决方案2】:

tdammers' answer 很好,但另一种选择是使用preg_replace_callback。如果你这样做,那么过程会发生一些变化:

  1. 创建一个正则表达式来匹配所有链接,和他的 Phase 1 一样
  2. 在回调中,搜索 YouTube 视频 ID。这将需要运行第二个preg_match,这是(在我看来)这种技术的最大问题。
  3. 根据是否为 ​​YouTube 返回替换字符串。

代码如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2012-04-01
    • 2020-04-24
    • 2015-01-14
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多