Почему у форума PHPBB в тексте BB-коды с числами?

Я тоже в свое время этому удивлялся, ковыряясь в исходниках форумного движка PHPBB. Какого, собственно, в базе сидят посты со странно преобразованными бб-кодами вида «[b:83493]жиртекст[/b:83493]», а не нормальное «[b]жиртекст[/b]». Это я собирался использовать форумный раздел как ленту новостей и вывести это на главную. Потом дошло, что это сделано для ускорения работы.

Все ббкоды парсятся парсером движка форума, который, как водится, слишком медленный и громоздкий для работы «на лету». Поэтому и запускается этот парсер только при сохранении. Все корректные ббкоды, которые «существуют», правильно оформлены и, кажется, соответствующие вложенности (хотя в последнем не уверен), заменяются на такие вот маркеры со своим числом для данного поста [b:83493] и [/b:83493]. А при выводе получившиеся конструкции просто заменяются на нужные открывающие и закрывающие HTML-теги какой-нибудь простой функцией preg_replace (или на основе её), что гораздо быстрее, чем парсить каждый пост при выводе «по полной программе».

Так что, если возникает надобность слазить в базу форума и вывести какие-то посты на своих страницах, например, как я — как ленту новостей (а что, готовая лента, да еще и с обсуждением), то это возможно. Не помню сейчас подробностей, но мне это удалось относительно легко. Несмотря на то, что ковыряться «с нуля» в исходниках PHPBB было сложновато поначалу.

Конечно, можно использовать простенькую регулярку и выкинуть эти числа из бб-кодов самостоятельно:

$res = preg_replace('/\[(\/{0,1}\w+):\d+\]/iU','[${1}]', $str);

Но тогда вы лишаетесь возможности попользовать парсер форума. Я бы рекомендовал использовать родные функции PHPBB для этого дела, они расчитаны на эти числовые маркеры и проблема отпадает сама собой.

Оценивайте целесообразность усилий сами. Если надо вывести, например, в блок пять последних топиков с короткими сниппетами без форматирования, то, понятное дело, заморачиваться не нужно, а надо просто тупо взять посты из базы и вырезать все бб-коды (с учетом числового маркера).

Стоит заметить, что саму методику, при которой все основные «тяжелые» действия происходят при сохранении текста в базу, а при выводе допускаются только относительно простые и быстродействующие операции следует применять и при решении других подобных задач.

17.09.2010 | 12:44




 
Добавить комментарий