Я перестроил все, кроме одной строки, только с адресом.
<?php
$input = "[url=http://stackoverflow.com]stackoverflow[/url]
[url=http://stackoverflow.com]http://stackoverflow.com/damn[/url]
http://stackoverflow.com/ok
[url=http://stackoverflow.com][img]url_to_img[/img][/url]
[url=http://stackoverflow.com][b]stackoverflow[/b][/url]
[url=http://stackoverflow.com][b][u][i]stackoverflow[/i][/u][/b][/url]
[url=http://stackoverflow.com][color=red]stackoverflow[/color][/url]
[url=http://stackoverflow.com][h1][color=red]stackoverflow[/color][/h1][/url]";
$match = [
'/\[url=([^\]]+)\](.*)\[\/url\]/im',
'/\[img\](.*)\[\/img\]/im',
'/\[b\](.*)\[\/b\]/im',
'/\[u\](.*)\[\/u\]/im',
'/\[i\](.*)\[\/i\]/im',
'/\[color=([^\]]+)\](.*)\[\/color\]/im',
'/\[h([1-6])\](.*)\[\/h(?:[1-6])\]/im',
];
$replace = [
'<a href="$1">$2</a>',
'<img src="$1">',
'<strong>$1</strong>',
'<u>$1</u>',
'<em>$1</em>',
'<span style="color:$1;">$2</span>',
'<h$1>$2</h$1>',
];
echo preg_replace($match, $replace, $input);
Это дает следующий результат:
<a href="http://stackoverflow.com">stackoverflow</a>
<a href="http://stackoverflow.com">http://stackoverflow.com/damn</a>
http://stackoverflow.com/ok
<a href="http://stackoverflow.com"><img src="url_to_img"></a>
<a href="http://stackoverflow.com"><strong>stackoverflow</strong></a>
<a href="http://stackoverflow.com"><strong><u><em>stackoverflow</em></u></strong></a>
<a href="http://stackoverflow.com"><span style="color:red;">stackoverflow</span></a>
<a href="http://stackoverflow.com"><h1><span style="color:red;">stackoverflow</span></h1></a>
согласующийся только URL немного сложнее. Это зависит от того, насколько вы продвинулись вперед. Он может обнаружить простые вещи, как example.com
или более продвинутые вещи, как ☃.net (что приводит к http://xn--n3h.net/)
Некоторые объяснения
Первое правило, которое мы пытаемся соответствовать и заменить это код URL. Мы просто начинаем с поиска внешнего вида [url=
, простого и жесткого кодирования. То, что мы ищем дальше, может быть очень много, но одна вещь, которую мы точно знаем, состоит в том, что мы должны заканчивать ]
. Затем мы можем использовать регулярное выражение, которое гласит: match all but ]
([^\]]+)
Обратите внимание, что я избежал символа ]
, иначе совпадение не удастся.
Далее я снова ищем все ((.*)
), пока мы не достигнем ожидаемого значения жесткого кодирования, [/url]
.
Это почти все правила соответствия для каждого типа bbcode, который вы хотели.
Что касается замены, то вы включаете то, что им нужно заменить, просто. Чтобы добавить значения, согласованные в регулярном выражении, используйте $1, $2, ..., $n
. Матч определяется моими скобками.
Для примера: '/ [URL = ([^]] +)] [/ URL]/IM (*.)'
Два скобки сегменты, выделенные жирным шрифтом в сегменты, которые содержат значения, которые мы будет получать от $1
и $2
Я попытался изо всех сил объяснить, как это сработало. Если что-то еще неясно, укажите это, и я постараюсь изо всех сил объяснить далее.
Я поддержал, но вы должны дать некоторое объяснение своего кода OP – Robert
Спасибо за верхнюю позицию. Внизу было добавлено некоторое объяснение, или, по крайней мере, я попытался объяснить некоторые части настолько хорошо, насколько мог. Если у вас есть предложения по поводу того, что еще нужно объяснить или как объяснить это, пожалуйста, дайте мне знать. @Robert – Morten
Конечно, вы не должны использовать жадные операторы, чтобы изменить '. *' На '. *?', Если вы знаете, зачем тогда вставлять два одинаковых bb-кода в ваш текст и посмотреть, что произойдет :) – Robert