Данный способ очень прост и решает одну задачу - замену элементов bb кода по шаблону средствами регулярных выражений из первого массива на html аналоги из второго массива.
$text = "Простой [b]пример[/b]";
function bbcode($var) {
$search = array(
'/\[b\](.*?)\[\/b\]/is',
'/\[i\](.*?)\[\/i\]/is',
'/\[u\](.*?)\[\/u\]/is',
'/\[img\](.*?)\[\/img\]/is',
'/\[url\](.*?)\[\/url\]/is',
'/\[url\=(.*?)\](.*?)\[\/url\]/is'
);
$replace = array(
'<strong>$1</strong>',
'<em>$1</em>',
'<u>$1</u>',
'<img src="$1" />',
'<a href="$1">$1</a>',
'<a href="$1">$2</a>'
);
$result = preg_replace ($search, $replace, $result);
return $result;
}
echo bbcode($text);
Результат будет следующий: Простой пример
Допустим у нас имеется плагин "slick" работающий на jQuery или любой другой (обычно по структуре они не отличаются). Скелет таких плагинов содержит следующий html код:
<div class="gallery">
<div>
<img src="/photo/1.jpg">
</div>
<div>
<img src="/photo/2.jpg">
</div>
<div>
<img src="/photo/3.jpg">
</div>
<div>
<img src="/photo/4.jpg">
</div>
</div>
Предположим, ссылки мы храним в MySQL БД, сделаем некий inject-вставку в текст при помощи BB-кодов, где "IMG" будет генерироваться циклом из БД. В итоге мы должны получить следующее:
[gallery] [img=Описание фотографии]/photo/1.jpg[/img] [img]/photo/2.jpg[/img] [img]/photo/3.jpg[/img] [img]/photo/4.jpg[/img] [/gallery]
Далее идея будет состоять в том, чтобы заменять "gallery" и "img" тегами "<div class='gallery_name'>" и "<img>".
$text = " текст текст текст текст
текст текст
текст
[gallery]
[img=Описание фотографии]/photo/1.jpg[/img]
[img]/photo/2.jpg[/img]
[img]/photo/3.jpg[/img]
[img]/photo/4.jpg[/img]
[/gallery]
текст текст ";
echo gallery($text);
function gallery($var) {
$search = array(
'/\[gallery\](.*?)\[\/gallery\]/is',
'/\[img\](.*?)\[\/img\]/is',
'/\[img\=(.*?)\](.*?)\[\/img\]/is');
$replace = array(
'<div class="gallery">$1</div>',
'<img src="$1" />',
'<img alt="$1" src="$2" />');
$var = preg_replace($search, $replace, $var);
return $var;
}
Этот вариант будет удобен, когда мы захотим сменить плагин на какой-нибудь другой и нам не нужно будет переименовывать блок gallery в БД, просто меняем класс регулярным выражением.
function gallery($var) {
$search = array(
'~\\G (?: [^\\[<]+ | <pre.*?>.*?</pre> | (?!\\[gallery). )*+\\K \\[gallery\\](.*?)\\[/gallery\\]~isx',
'~\\G (?: [^\\[<]+ | <pre.*?>.*?</pre> | (?!\\[img). )*+\\K \\[img\\](.*?)\\[/img\\]~isx',
'/(?:<br[^>]*>\s*)+/i'
);
$replace = array(
'<div class="slick_gallery">$1</div>',
'<div><img src="$1" /></div>',
''
);
$var = preg_replace($search, $replace, $var);
return $var;
}
echo gallery($text);