2015-08-25 2 views
0
[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> 

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

ответ

1

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

<?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

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

+0

Я поддержал, но вы должны дать некоторое объяснение своего кода OP – Robert

+0

Спасибо за верхнюю позицию. Внизу было добавлено некоторое объяснение, или, по крайней мере, я попытался объяснить некоторые части настолько хорошо, насколько мог. Если у вас есть предложения по поводу того, что еще нужно объяснить или как объяснить это, пожалуйста, дайте мне знать. @Robert – Morten

+0

Конечно, вы не должны использовать жадные операторы, чтобы изменить '. *' На '. *?', Если вы знаете, зачем тогда вставлять два одинаковых bb-кода в ваш текст и посмотреть, что произойдет :) – Robert

Смежные вопросы