具体而言,仅将 YouTube 网址转换为 iframe 标记,同时将 BBCode 网址转换为 html 元素
Specifically convert only YouTube urls to iframe tags while converting BBCode urls to html elements
我正在尝试将 youtube 视频 links 转换为 iframe 以将它们嵌入到我的网站上,但我遇到了问题,因为我已经将 urls 转换为锚标记并且它是与 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=[=11=]][=11=][/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/\" allowfullscreen></iframe>', $string);
第一行得到的只是一个普通的 url,因为我正在使用 BBCode,它与 [img]
标签等其他内容冲突。 $youtubeURL
是获取所有 youtube link 并将它们转换为 iframe,但由于第一个 link 转换,它导致 href
被放入 scr=
.
我设法通过交换我的代码解决了我的问题,因此它首先转换 YouTube 链接,然后再转换其他 URL,然后稍微更改一下。新代码:
$youtubeURL = '/\s*[a-zA-Z\/\/:\.]*youtube.com\/watch\?v=([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i';
$string = preg_replace($youtubeURL, '<br><iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br>', $string);
$url = '~(\s|^)(https?://.+?)(\s|$)~im';
$string = preg_replace($url, '<a href="[=10=]">[=10=]</a>', $string);
从 开始,我已经开发并测试了一整套正则表达式来帮助您上手。我承认这组模式可以进一步细化以更加浓缩(更少的模式总数)并且 youtube 验证模式可以更严格,但老实说我没有时间深入那些兔子洞。
在考虑 compexity/diversity 的 youtube 网址时,您可能需要参考我从 Whosebug 页面和互联网上提取的示例列表。 https://regex101.com/r/zinjze/1
代码:(Demo)
$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></strong>',
'<em></em>',
'<u></u>',
'<ul></ul>',
'<li></li>',
'<a href="../login/profile?u=" target="_blank"></a>',
'<iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
'<iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
'<a href="" target="_blank"></a>',
'<a href="" target="_blank"></a>',
'<img src=""></img>',
'<quote></quote>',
'<code></code>',
'<iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
'<a href="[=10=]" target="_blank">[=10=]</a>'
);
echo preg_replace($search, $replace, $bbcode);
未渲染的输出:(如果您想查看渲染后的输出,您可以在 http://phptester.net/ 中复制粘贴我的代码片段)
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 视频 links 转换为 iframe 以将它们嵌入到我的网站上,但我遇到了问题,因为我已经将 urls 转换为锚标记并且它是与 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=[=11=]][=11=][/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/\" allowfullscreen></iframe>', $string);
第一行得到的只是一个普通的 url,因为我正在使用 BBCode,它与 [img]
标签等其他内容冲突。 $youtubeURL
是获取所有 youtube link 并将它们转换为 iframe,但由于第一个 link 转换,它导致 href
被放入 scr=
.
我设法通过交换我的代码解决了我的问题,因此它首先转换 YouTube 链接,然后再转换其他 URL,然后稍微更改一下。新代码:
$youtubeURL = '/\s*[a-zA-Z\/\/:\.]*youtube.com\/watch\?v=([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i';
$string = preg_replace($youtubeURL, '<br><iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br>', $string);
$url = '~(\s|^)(https?://.+?)(\s|$)~im';
$string = preg_replace($url, '<a href="[=10=]">[=10=]</a>', $string);
从
在考虑 compexity/diversity 的 youtube 网址时,您可能需要参考我从 Whosebug 页面和互联网上提取的示例列表。 https://regex101.com/r/zinjze/1
代码:(Demo)
$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></strong>',
'<em></em>',
'<u></u>',
'<ul></ul>',
'<li></li>',
'<a href="../login/profile?u=" target="_blank"></a>',
'<iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
'<iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
'<a href="" target="_blank"></a>',
'<a href="" target="_blank"></a>',
'<img src=""></img>',
'<quote></quote>',
'<code></code>',
'<iframe width="640" height="360" src="https://www.youtube.com/embed/" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
'<a href="[=10=]" target="_blank">[=10=]</a>'
);
echo preg_replace($search, $replace, $bbcode);
未渲染的输出:(如果您想查看渲染后的输出,您可以在 http://phptester.net/ 中复制粘贴我的代码片段)
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>