如何将嵌入代码附加到 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
的参数中,因此 (?<=v=)(.+?)(?=(&|$))
会查找 v=
和 &
或字符串结尾之间的所有内容:
(?<=v=)
是一个积极的向后看,确保我们在 v=
之后寻找一个字符串
(.+?)
匹配一个或多个字符(任何字符,行终止符除外),惰性
(?=(&|$))
是一个正向前瞻,确保我们在 & 符号 (&
) 或字符串结尾 ($
) 之前查找字符串
【讨论】:
链接/url 在文本中,它不是只有链接/url 的静态字符串。这是否说明了这一点? 除了添加附加iframe
的代码外,我没有更改您的makelink
函数。它仍然负责从文本中提取url
s。在您的代码在文本中找到 url
匹配项后,我的代码将继续工作。
你好。好像效果不错,谢谢。但是,如果 url 是主网站 youtube.com(没有视频,只是链接到 youtube),则会触发偏移错误。有什么办法可以避免吗?也许只有在有视频 ID 时才会触发嵌入等
也许我会在 isYouTubeUrl() 函数中加入一些“检查 id”
@mowgli 我已经修改了代码以解决这个问题(对于任何未来的读者)。我还将函数从isYouTubeUrl
重命名为isYouTubeVideoUrl
,以更准确地反映它检查的内容。我唯一不知道的是短网址是否可以是视频以外的其他内容(我环顾了一个频道,但没有找到一个选项)。如果事实证明是这样,那么您也必须考虑到这一点。以上是关于如何将嵌入代码附加到 youtube 锚链接的主要内容,如果未能解决你的问题,请参考以下文章