如何将嵌入代码附加到 youtube 锚链接

Posted

技术标签:

【中文标题】如何将嵌入代码附加到 youtube 锚链接【英文标题】:How to append embed code to youtube anchor link 【发布时间】: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"   src="https://www.youtube.com/embed/LOLAy72Tv24/" allowfullscreen></iframe>

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

【问题讨论】:

使用 parse_url 来确定 url 主机是否是 YouTube,如果是,请附加您需要的内容。 @El_Vanja 谢谢。但是我对如何只编写替换/追加代码有点不知所措 【参考方案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"   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,以更准确地反映它检查的内容。我唯一不知道的是短网址是否可以是视频以外的其他内容(我环顾了一个频道,但没有找到一个选项)。如果事实证明是这样,那么您也必须考虑到这一点。

以上是关于如何将嵌入代码附加到 youtube 锚链接的主要内容,如果未能解决你的问题,请参考以下文章

如何将锚链接添加到页面的各个部分?

使用jQuery滚动到锚链接[重复]

使用jQuery滚动到锚链接[重复]

Android Studio 如何在 LinearLayout 元素中实现锚链接?

jQuery - 使用锚链接将元素滚动到屏幕中间而不是顶部

如何将 wmode=transparent 动态添加到 Youtube 嵌入代码?