专门将 YouTube 网址转换为 iframe 标签,同时将 BBCode 网址转换为 html 元素 [英] Specifically convert only YouTube urls to iframe tags while converting BBCode urls to html elements

查看:32
本文介绍了专门将 YouTube 网址转换为 iframe 标签,同时将 BBCode 网址转换为 html 元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将 youtube 视频链接转换为 iframe 以将它们嵌入到我的网站上,但我遇到了问题,因为我已经将 url 转换为锚标签,并且它与 youtube url 冲突.

I'm trying to convert youtube video links into iframes to embed them onto my website but I'm having a problem as I am already converting urls to anchor tags and it's conflicting with the youtube url.

这是我的代码:

$string = 'https://www.google.com and https://www.youtube.com/watch?v=umFQckeDwEE';
$url = '~(\s|^)(https?://.+?)(\s|$)~im';
$string = preg_replace($url, '[url=$0]$0[/url]', $string);
$youtubeURL = '/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i';
$string = preg_replace($youtubeURL, '<iframe width=\"420\" height=\"315\" src=\"https://www.youtube.com/embed/$2\" allowfullscreen></iframe>', $string);

第一行获取任何只是一个普通 url 的内容,因为我使用 BBCode 它与其他内容(例如 [img] 标签)发生冲突.$youtubeURL 是获取所有 youtube 链接并将它们转换为 iframe,但由于第一次链接转换,它会导致 href 被放入 scr=.

The first line gets anything that is just a plain url as I am using BBCode it conflicted with other stuff like the [img] tag. The $youtubeURL is to get all youtube links and turn them into iframes but because of the first link conversion it causes an href to be put in the scr=.

推荐答案

您之前的问题启动,我已经开发并测试了一整套正则表达式,让您顺利上路.我承认这组模式可以进一步细化以更加简洁(更少的模式总数)并且 youtube 验证模式可以更严格,但老实说我没有时间去那些兔子洞.

Launching from your previous question, I've developed and tested a complete battery of regular expressions to get you on your way. I will admit that this set of pattern could be refined further to be more condensed (fewere total patterns) and that the youtube validation patterns could be more strict, but I honestly don't have time to go down those rabbit holes.

在考虑 youtube 网址的复杂性/多样性时,您可能需要参考我从 StackOverflow 页面和互联网中提取的示例列表.https://regex101.com/r/zinjze/1

When considering the compexity/diversity of youtube urls, you may want to reference this list of examples that I pulled from StackOverflow pages and the internet. https://regex101.com/r/zinjze/1

代码:(演示)

$bbcode = <<<BBCODE
Want a list?
[ul][li]Here is a video: https://www.youtube.com/watch?v=mUxt--mMjwA[/li]
[li]This is a [b]tagged[/b] video: [url]https://www.youtube.com/watch?v=u6MyOXk98DI[/url][/li]
[li]This is a [b]tagged & attributed[/b] video: [url=https://www.youtube.com/watch?v=8G2WzH4AKpE]Pearl Jam - Present Tense[/url][/li]
[li]Look at this:https://www.example.com/example?ohyeah=sure#okay this is a raw link[/li]
[li][i]No attribute[/i] bbcode url: [url]http://example.com/x1[/url][/li]
[li]A url with link and link text: [url=http://example.com/x2]x2[/url][/li]
[li]Image with \"ignorable" text: [IMG=https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Portrait_of_Julie_Bishop.jpg/220px-Portrait_of_Julie_Bishop.jpg]Julie Bishop[/IMG][/li]
[li]Image: [img=https://docs.joomla.org/images/3/37/Joomla-3D-Vertical-logo-light-background-en.png][/img][/li]
[li][quote]"I could either watch it happen or be a part of it."[/quote]
    - Elon Musk[/li]
[li][user=2943403]mickmackusa[/user][/li]
[li]Code: 
[code]while (\$noSuccess) {
    tryAgain();
    if (\$dead) break;
}[/code][/li]
[/ul]
BBCODE;

$search = array (
    '~\[b](.*?)\[/b]~is',
    '~\[i](.*?)\[/i]~is',
    '~\[u](.*?)\[/u]~is',
    '~\[ul](.*?)\[/ul]~is',
    '~\[li](.*?)\[/li]~is',
    '~\[user=(.*?)](.*?)\[/user]~i',
    '~\[url=https?.*?(?:[/?&](?:e|vi?|ci)(?:[/=]|%3D)|youtu\.be/|embed/|/user/[^/]+#p/(?:[^/]+/)+)([\w-]{10,12})].*?\[/url]~i',
    '~\[url]https?.*?(?:[/?&](?:e|vi?|ci)(?:[/=]|%3D)|youtu\.be/|embed/|/user/[^/]+#p/(?:[^/]+/)+)([\w-]{10,12}).*?\[/url]~i',
    '~\[url=((?:ht|f)tps?://[a-z\d.-]+\.[a-z]{2,3}/\S*?)](.*?)\[/url]~i',
    '~\[url]((?:ht|f)tps?://[a-z\d.-]+\.[a-z]{2,3}/\S*?)\[/url]~i',
    '~\[img=(.*?)].*?\[/img]~i',
    '~\[quote](.*?)\[/quote]~is',
    '~\[code](.*?)\[/code]~is',
    '~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|(?:\bhttps?.*?(?:[/?&](?:e|vi?|ci)(?:[/=]|%3D)|youtu\.be/|embed/|/user/[^/]+#p/(?:[^/]+/)+)([\w-]{10,12}))\S*~i',
    '~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://.+?(?=\s|$)~im'
);

$replace = array (
    '<strong>$1</strong>',
    '<em>$1</em>',
    '<u>$1</u>',
    '<ul>$1</ul>',
    '<li>$1</li>',
    '<a href="../login/profile?u=$1" target="_blank">$2</a>',
    '<iframe width="640" height="360" src="https://www.youtube.com/embed/$1" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
    '<iframe width="640" height="360" src="https://www.youtube.com/embed/$1" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
    '<a href="$1" target="_blank">$2</a>',
    '<a href="$1" target="_blank">$1</a>',
    '<img src="$1"></img>',
    '<quote>$1</quote>',
    '<code>$1</code>',
    '<iframe width="640" height="360" src="https://www.youtube.com/embed/$1" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
    '<a href="$0" target="_blank">$0</a>'
);    

echo preg_replace($search, $replace, $bbcode);

未渲染的输出:(您可以将我的代码片段复制粘贴到 http://phptester.net/ 如果你想看到渲染的输出)

Unrendered Output: (you can copy-paste my snippet in http://phptester.net/ if you want to see the rendered output)

Want a list?
<ul><li>Here is a video: <iframe width="640" height="360" src="https://www.youtube.com/embed/mUxt--mMjwA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<li>This is a <strong>tagged</strong> video: <iframe width="640" height="360" src="https://www.youtube.com/embed/u6MyOXk98DI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></li>
<li>This is a <strong>tagged & attributed</strong> video: <iframe width="640" height="360" src="https://www.youtube.com/embed/8G2WzH4AKpE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></li>
<li>Look at this:<a href="https://www.example.com/example?ohyeah=sure#okay" target="_blank">https://www.example.com/example?ohyeah=sure#okay</a> this is a raw link</li>
<li><em>No attibute</em> bbcode url: <a href="http://example.com/x1" target="_blank">http://example.com/x1</a></li>
<li>A url with link and link text: <a href="http://example.com/x2" target="_blank">x2</a></li>
<li>Image with \"ignorable" text: <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Portrait_of_Julie_Bishop.jpg/220px-Portrait_of_Julie_Bishop.jpg"></img></li>
<li>Image: <img src="https://docs.joomla.org/images/3/37/Joomla-3D-Vertical-logo-light-background-en.png"></img></li>
<li><quote>"I could either watch it happen or be a part of it."</quote>
    - Elon Musk</li>
<li><a href="../login/profile?u=2943403" target="_blank">mickmackusa</a></li>
<li>Code: 
<code>while ($noSuccess) {
    tryAgain();
    if ($dead) break;
}</code></li>
</ul>

这篇关于专门将 YouTube 网址转换为 iframe 标签,同时将 BBCode 网址转换为 html 元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆