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

How to append embed code to youtube anchor link

我使用此代码使网址可作为论坛帖子中的锚 link 进行点击。

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 links 嵌入到 link 下方的嵌入代码中(我猜是附加到 link)。

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

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

<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 并在原始 link 下方放置嵌入代码,同时将两者一起输出。

这是我提出的解决方案:

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 的参数中,因此 (?<=v=)(.+?)(?=(&|$)) 查找 v=& 之间的所有内容或字符串:

  • (?<=v=) 是一种积极的回溯,确保我们在 v=
  • 之后立即查找字符串
  • (.+?) 匹配一个或多个字符(任意字符,行终止符除外),lazy
  • (?=(&|$)) 是一个积极的前瞻,确保我们在 & 符号 (&) 之前或字符串结尾 ($)[=46= 之前查找字符串]