Обработка BB-code в PHP регулярными выражениями

Способ на замене элементов из первого массива на второй

Данный способ очень прост и решает одну задачу - замену элементов 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 в БД, просто меняем класс регулярным выражением.

Вариант для BB-кода, находящегося внутри тега "pre"

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);

 

Комментариев — 0
Войдите на сайт, чтобы писать комментарии от своего имени.
  • Популярное
  • Коментарии
Sony Vegas Pro 13. Сохраняем видео без потери качества
09 июля 2016 года в 13:36 | Культура, искусство, кино
Статья о том, как сохранять видео без потери качества в видео редакторе Sony Vegas Pro 13 ...
Как добавить сайт AMUR.PRO в закладки
25 сентября 2016 года в 10:28 | Компьютеры
Бывает такое, что мы натыкаемся на интересный сайт в Интернете и хотим посещать его снова и снова, в...
Инструкция по установке и настройке Sublime Text 3
14 декабря 2015 года в 21:15 | Интернет
В этой инструкции я опишу установку Sublime Text 3, настройку, установку различных плагинов и многое...
Показать еще статьи
Импорт большого дампа БД в OpenServer через консоль
18 сентября в 02:11 | Аноним 29
«Годнота! ...»
Компьютер не видит жесткий диск - причины - решения.
13 сентября в 09:30 | Админ
« Возможно поможет эта статья: https://amur.pro/blog/kak_ispravit_oshibku_dispetcher_virtualnih_diskov_128/ ...»
Компьютер не видит жесткий диск - причины - решения.
09 сентября в 17:02 | Аноним 28
«Пишут: Ошибка службы виртуальных дисков: Диск подключен к сети. Диск остается недопустимым. ...»
Sony Vegas Pro 13. Сохраняем видео без потери качества
01 августа в 17:29 | Аноним 27
«Ужасное качество видео на выходе. ...»
Sony Vegas Pro 13. Сохраняем видео без потери качества
27 июня в 15:18 | Аноним 26
«А какой редактор посоветуете, если не Вегас? ...»
Sony Vegas Pro 13. Сохраняем видео без потери качества
22 июня в 22:44 | Аноним 25
«Качество помойка, вегас не умеет оставлять в hd , там идет какая то сраная перекодировка и он её превращает в говно ...»
Sony Vegas Pro 13. Сохраняем видео без потери качества
14 июня в 15:14 | Аноним 24
«После рендера черные полосы в проигрывателе появились :( ...»
Sony Vegas Pro 13. Сохраняем видео без потери качества
16 мая в 05:07 | Аноним 23
«Зачем количество слоёв 8 поставил ? двух вроде достаточно лучше 1. А вт количество кадров сверки , опорных кадров можно и 8 поставить, это вроде и есть рифреймс...»
Sony Vegas Pro 13. Сохраняем видео без потери качества
12 мая в 05:28 | Аноним 22
«спасибо! ...»
Sony Vegas Pro 13. Сохраняем видео без потери качества
03 мая в 02:14 | Аноним 21
«Такой способ, цвета искажает. ...»