регулярное выражение bbcode и гиперссылка из строки

[url=http://stackoverflow.com]stackoverflow[/url]
[url=http://stackoverflow.com]http://stackoverflow.com[/url]
http://stackoverflow.com
[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]

Измените это на это:

<a href="http://stackoverflow.com">stackoverflow</a>
<a href="http://stackoverflow.com">http://stackoverflow.com</a>
<a href="http://stackoverflow.com">http://stackoverflow.com</a>
<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"><span style="color:red">stackoverflow</span></a>
<a href="http://stackoverflow.com"><h1><span style="color:red">stackoverflow</span></h1></a>

Я пытался найти что-то, что заменить все, а не URL-адрес bbcode.
Я пытался использовать https://github.com/wookieb/bbcode но когда я обновляю php 5.2 до 5.5, перестает работать.
Я пытался использовать http://jbbcode.com/ но не разбирать URL из строки.

0

Решение

Я перестроил все, кроме одной строки, только с URL.

<?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] / им»
Два круглых скобка, выделенные жирным шрифтом, — это сегменты, содержащие значения, которые мы будем получать $1а также $2

Я старался изо всех сил, чтобы объяснить, как это работает. Если что-то все еще неясно, укажите это, и я сделаю все возможное, чтобы объяснить дальше

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector