Начиная с вашего предыдущего вопроса , я разработал и протестировал полный набор регулярных выражений, чтобы помочь вам в этом. Я признаю, что этот набор шаблонов может быть доработан в дальнейшем, чтобы быть более сжатым (меньше всего шаблонов), и что шаблоны проверки на YouTube могут быть более строгими, но я, честно говоря, не успеваю пройти по этим кроличьим дырам.
При рассмотрении сложности / разнообразия URL-адресов YouTube, вы можете сослаться на этот список примеров, которые я извлек со страниц StackOverflow и Интернета. 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);
Unrendered Output: ( вы можете скопировать и вставить мой фрагмент в 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>