如何将嵌入代码附加到 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= 之前查找字符串]
我使用此代码使网址可作为论坛帖子中的锚 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= 之前查找字符串]