【问题标题】:How to append embed code to youtube anchor link如何将嵌入代码附加到 youtube 锚链接
【发布时间】:2021-03-13 16:26:39
【问题描述】:

我使用此代码使 url 作为论坛帖子中的锚链接可点击。

function makelink($str) {

    $str = preg_replace_callback('/((((http)(s)?:\/\/)|www\.)[-0-9æøåa-zA-Z?-??-?\(\)%_+\.~#?&;:@\/\/=]+)(?<!\.)/i', function($matches) {
        if (strtolower(substr($matches[0], 0 , 4)) == 'www.') {
            $matches[0] = 'http://' . $matches[0];
        }
        return '<a href="'.$matches[0].'" title="link" rel="noreferrer">'.$matches[0].'</a>';
    }, $str);
    
    return trim($str);

}

它工作正常。现在我还需要将 youtube 链接放入链接下方的嵌入代码中(我猜想附加到链接中)。

这没关系,有一个额外的替换例程正在进行。

如何制作一些代码来替换生成的锚点(如果它是 youtube 链接):

<a href="https://www.youtube.com/watch?v=LOLAy72Tv24" title="link" rel="noreferrer">https://www.youtube.com/watch?v=LOLAy72Tv24</a>

有了这个:

<a href="https://www.youtube.com/watch?v=LOLAy72Tv24" title="link" rel="noreferrer">https://www.youtube.com/watch?v=LOLAy72Tv24</a>
<br />
<iframe class="youtube" width="350" height="250" src="https://www.youtube.com/embed/LOLAy72Tv24/" allowfullscreen></iframe>

所以它只需要获取视频ID并将嵌入代码放在原始链接下方,同时将两者一起输出。

【问题讨论】:

  • 使用 parse_url 来确定 url 主机是否是 YouTube,如果是,请附加您需要的内容。
  • @El_Vanja 谢谢。但是我对如何只编写替换/追加代码有点不知所措

标签: php regex youtube preg-replace


【解决方案1】:

这是我提出的解决方案:

function makelink($str) {
    $pattern = '/((((http)(s)?:\/\/)|www\.)[-0-9æøåa-zA-Z?-??-?\(\)%_+\.~#?&;:@\/\/=]+)(?<!\.)/i';
    $str = preg_replace_callback($pattern, function($matches) {
        if (strtolower(substr($matches[0], 0 , 4)) == 'www.') {
            $matches[0] = 'http://' . $matches[0];
        }
        // store anchor tag html in a variable instead of returning immediately
        $html = '<a href="'.$matches[0].'" title="link" rel="noreferrer">'.$matches[0].'</a>';
        if (isYouTubeVideoUrl($matches[0])) {
            $html .= '<br />'.makeiFrame($matches[0]);
        }
        return $html;
    }, $str);

    return trim($str);
}

function isYouTubeVideoUrl(string $url): bool
{
    return (parse_url($url, PHP_URL_HOST) === 'www.youtube.com' || isYouTubeShortUrl($url))
        && strpos(parse_url($url, PHP_URL_QUERY), 'v=') !== false;
}

function isYouTubeShortUrl(string $url): bool
{
    return parse_url($url, PHP_URL_HOST) === 'youtu.be';
}

function makeiFrame(string $url): string {
    $embedUrl = 'https://www.youtube.com/embed/'.getYouTubeVideoId($url).'/';
    return '<iframe class="youtube" width="350" height="250" src="'.$embedUrl.'" allowfullscreen></iframe>';
}

function getYouTubeVideoId(string $url): string
{
    if (isYouTubeShortUrl($url)) {
        preg_match('/[^\/]+$/', $url, $matches);
        return $matches[0];
    }

    preg_match('/(?<=v=)(.*?)(?=(&|$))/', $url, $matches);
    return $matches[0];
}

它既适用于常规 YouTube 网址 (https://www.youtube.com/watch?v=LOLAy72Tv24) 也适用于短 YouTube 网址 (https://youtu.be/LOLAy72Tv24)。它还支持将 v 参数放在常规 URL 的查询字符串中的任何位置。

大部分代码都很简单,关键在于提取视频id。

短 URL 的格式是 id 位于斜杠后面,因此 [^\/]+$ 会在字符串末尾查找不是斜杠的任何字符:

  • [^\/] 匹配任何非斜杠的字符
  • + 是一个或多个的量词,贪婪
  • $ 断言字符串末尾的位置

常规 URL 的格式是 id 在名为 v 的参数中,因此 (?&lt;=v=)(.+?)(?=(&amp;|$)) 会查找 v=&amp; 或字符串结尾之间的所有内容:

  • (?&lt;=v=) 是一个积极的向后看,确保我们在 v= 之后寻找一个字符串
  • (.+?) 匹配一个或多个字符(任何字符,行终止符除外),惰性
  • (?=(&amp;|$)) 是一个正向前瞻,确保我们在 & 符号 (&amp;) 或字符串结尾 ($) 之前查找字符串

【讨论】:

  • 链接/url 在文本中,它不是只有链接/url 的静态字符串。这是否说明了这一点?
  • 除了添加附加iframe 的代码外,我没有更改您的makelink 函数。它仍然负责从文本中提取urls。在您的代码在文本中找到 url 匹配项后,我的代码将继续工作。
  • 你好。好像效果不错,谢谢。但是,如果 url 是主网站 youtube.com(没有视频,只是链接到 youtube),则会触发偏移错误。有什么办法可以避免吗?也许只有在有视频 ID 时才会触发嵌入等
  • 也许我会在 isYouTubeUrl() 函数中加入一些“检查 id”
  • @mowgli 我已经修改了代码以解决这个问题(对于任何未来的读者)。我还将函数从isYouTubeUrl 重命名为isYouTubeVideoUrl,以更准确地反映它检查的内容。我唯一不知道的是短网址是否可以是视频以外的其他内容(我环顾了一个频道,但没有找到一个选项)。如果事实证明是这样,那么您也必须考虑到这一点。
猜你喜欢
  • 2011-06-10
  • 2015-02-12
  • 1970-01-01
  • 2012-02-07
  • 2011-09-02
  • 1970-01-01
  • 2020-11-10
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多