php - 使用PHP查找字符串形式的链接。与普通链接和YouTube链接不同

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

最佳答案

首先,沟eregi。已过时,它将很快消失。

然后,仅通过一遍就可以做到这一点太长了。我认为将这分为三个阶段会更好。

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

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

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

这种方法有几个优点:

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

  • 关于php - 使用PHP查找字符串形式的链接。与普通链接和YouTube链接不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7894107/

    相关文章:

    php - 一个语句中有多个之间

    php - PrestaShop:如果产品不存在,则重定向到主页

    python - Python脚本youtube-dl返回一个新文件

    matlab - 数值稳定的实现

    c - 如何在 c 中编写 exp(x) 代码?

    OpenCL Intel Iris 集成显卡退出并出现 Abort Trap 6 : Timeout Issue

    javascript - Blueimp - 禁用以前上传的图像的删除按钮

    php - Zend Framework 表单、装饰器和验证 : should I go back to plain HTML?

    javascript - Youtube Media API无法正确加载。

    android - 统一,通过 WebView 获取youtube网址,然后统一播放视频