PHP та BBCode, Нотатки розробника

У мене періодично з'являється потреба у використанні «інтерпретатора» BBCode у своїх проектах (написаного на PHP), і постійно немає часу шукати якесь більш-менш зручне рішення, що в результаті виливається у використання або створення «милиць» для кожного конкретного випадку. Але ось, схоже, вдалося знайти те, що хотілося.

Моя претензія до подібних готових рішень зазвичай насамперед полягає у нездатності цих бібліотек правильно обробляти абзаци. Фактично вони зазвичай взагалі не використовують абзаци (тегP ), натомість в результаті своєї роботи вони просто вставляють тег, замінюючи звичайні символи перенесення рядка. Я вважаю такий метод емулювання абзаців у 98 відсотках, м'яко кажучи, недоречним. Але оскільки перенесення рядків за коштами набагато легше реалізувати замість «людських»

так більшість і робить 🙁 Деякі навіть вигадують виправдання, що мовляв з br навіть правильніше, частково, через подібну лінощі розробників різних готових бібліотек, інша частина людей думає, що тегP є застарілим (адже навіть у багатьох готових продуктах та сайтах абзаци формуються шляхом використання ) 🙂

Спочатку потрібно завантажити бібліотеку (на момент написання статті версія бібліотеки була 0.3.3). У завантаженому архіві в папці src ви виявите два потрібні нам файли: stringparser.class.php і stringparser_bbcode.class.php.

Для прикладу припустимо, що ми маємо порожній файл «index.php» і поруч із ним ми створимо папку «/bbcode/», що містить у собі два згаданих вище файла. Для прикладу мінімальний вміст файлу "index.php" має бути таким (запустивши цей приклад можна буде відразу побачити, чи працює бібліотека):

ФункціяaddCode

Найбільший інтерес у цьому коді може викликати, мабуть, функція addCode у об'єкта класу StringParser_BBCode, ось її прототип та список опису параметрів:

Ця функція додає уявлення про ті чи інші коди (bb-кодах) для об'єкта класу, щоб він міг потім виявити ці коди в тексті та відповідним чином обробити їх. Тобто. можна сказати, що спочатку об'єкт класу StringParser_BBCode взагалі нічого не знає про стандартні bb-коди і не здатний обробити їх. Тому цей об'єкт потрібно буде після кожної ініціалізації «навчати» всім різновидам BB-кодів.

$code (у прикладі має значення 'b') Код, який потрібно шукати у тексті для обробки. Тобто. якщо вказати код test , то потім в тексті, що обробляється, буде шукатися тег [test] і оброблятися відповідно до вказівок в інших параметрах аналізованої функції. $type (у прикладі має значення 'simple_replace') Вказівка ​​того, як тег повинен оброблятися (якого він типу). Існують різні визначені типи тегів, які будуть описані нижче. У нашому прикладі вказаний тип 'simple_replace' який вказує на те, що тег буде парним (тег, що відкривається [b] і закривається [/b]) і що ці теги будуть замінені на вказані нижче html теги. $callback (у прикладі має значення null) Дозволяє вказати ім'я функції, яка буде викликатися при обробці знайденого тега в тексті. У випадку з типом тега 'simple_replace' така функція не викликається, і, відповідно, цей параметр можна вказати null. $params (у прикладі має значення array(‘start_tag’ => ‘’, ‘end_tag’ => ‘‘)) У цьому параметрі в основному вказується, який потрібно вставляти html тег замість bb тега. Найменування параметрів залежить від того, який тип тега ми вказали в параметрі $type.$content_type (у прикладі має значення 'inline') Тип внутрішнього вмісту тега. Може приймати значення: 'inline', 'block', 'link', 'image'. Якщо я не помиляюся, можна прописувати і свої типи, щоб потім можна було вказувати для цього вмісту свої індивідуальні фільтри (приклад використання фільтрів дивіться нижче). $allowed_in (у прикладі має значення array ('block', 'inline')) У цьому параметрі можна вказати, всередині яких типів об'єктів може бути створений bb-код (його обробка буде просто ігноруватися в іншому випадку). У прикладі ми вказали, що елемент може бути як усередині блокових елементів, і усередині лінійних. $not_allowed_in (у прикладі має значення array()) Має призначення, протилежне за змістом попереднього параметра.

Види обробки тегів

Опис параметрів $type у функції addCode.

Приклад коду із «бойових» умов

Ось приклад файлу index.php з більш розширеною конфігурацією класу для обробки більшого числа тегів, в ньому ж можна зрозуміти, як працюють callback функції і т.п.:

Післямова

Я, звичайно ж, не зробив повний переклад документації, а лише найнеобхідніший мінімум, за більш детальною документацією ви можете звернутися на офіційний сайт (взагалі там описано куди більше різних можливостей).

Цю бібліотеку також не важко впровадити в будь-якій php фреймворк, я, наприклад, з успіхом проробляв це для cackePHP.

Якщо ви теж зустрічали подібні бібліотеки (коректно працюють з абзацами!), цікаво було б дізнатися про них.