Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

API

Свойства класса bbcode

  • tag - имя тега, которому сопоставлен данный экземпляр класса. Или пустая строка, если объект не сопоставлен конкретному тегу. Это свойство может понадобиться вам, если захотите добавить свой тег, или переопределить какой-то из сущуествующих. Более подробные пояснения смотрите ниже в главе "Как создать тег".
     
  • attrib - массив пар
    [имя атрибута] => значение атрибута

    для тега, которому сопоставлен экземпляр класса. Если объект не сопоставлен конкретному тегу, то этот массив пуст. Это свойство может понадобиться вам, если захотите добавить свой тег, или переопределить какой-то из сущуествующих. Более подробные пояснения смотрите ниже в главе "Как создать тег".
     
  • text - текст с обрабатываемым ББКодом. Этот текст ложится сюда при инициализации объекта, и меняется при каждом вызове конструктора класса или метода parse.
     
    Свойство text может оказаться полезным для оптимизации работы ваших скриптов. Из следующих примеров это станет более понятно:
     
    PHP
    /*
    Получаем текст BBCode, парсим его, и результат парсинга сохраняем в файле
    (это в примере. Лучше - в базе данных). Это позволит не парсить один и тот же
    текст дважды.
    */

    $text = isset($_POST['text']) ? $_POST['text'] : '';
    require_once 'ваш/путь/bbcode.lib.php';
    $bb = new bbcode($text);
    $fp = fopen('./bb_syntax', 'wb');
    fwrite($fp, serialize($bb->syntax));
    fclose($fp);

    Теперь, для восстановления исходного BBCode нам понадобится свойство text:
     
    PHP
    /*
    Берем из файла (для примера) результат парсинга BBCode, восстанавливаем
    исходный BBCode и выдаем его для редактирования
    */

    $syntax = unserialize(file_get_contents('./bb_syntax'));
    require_once 'ваш/путь/bbcode.lib.php';
    $bb = new bbcode($syntax);
    echo '<textarea cols="100" rows="30">';
    echo htmlspecialchars($bb->text);
    echo '</textarea>';

    В следующем примере берем из файла результат парсинга BBCode, генерируем HTML и выводим его на печать:
     
    PHP
    $syntax = unserialize(file_get_contents('./bb_syntax'));
    require_once 'ваш/путь/bbcode.lib.php';
    $bb = new bbcode($syntax);
    echo $bb->get_html();

  • syntax - массив, содержащий синтаксический разбор ББКода. Заполняется при вызове конструктора класса или при вызове метода parse.
     
    Структура массива "syntax"
    Array
    (
        ...
        [i] => Array  // [i] - целочисленный ключ начиная с 0
            (
                [type] => тип элемента: 'text', 'open', 'close' или 'open/close'
                          'text'  - элемент соответствует тексту между тегами
                          'open'  - элемент соответствует открывающему тегу
                          'close' - элемент соответствует закрывающему тегу
                          'open/close' - элемент соответствует закрытому тегу
                                         (например такому: [img="..." /])
                [str]  => строковое представление элемента: текст между тегами
                          или тег (например: '[font color=red size=+1]')
                [name] => имя тега. Всегда в нижнем регистре. Например: 'color'.
                          Значение [name] отсутствует для элементов типа 'text'
                          и может быть пустой строкой для элементов типа
                          'close'. В последнем случае элемент будет
                          соответствовать тегу '[/]', который будет считаться
                          закрывающим для последнего незакрытого перед ним.
                [attrib] => Array         // Это значение существует только для
                    (                     // элементов типов 'open' и
                        ...               // 'open/close'
                        ...
                        [имя атрибута] => значение атрибута. Например:
                        ...               [color] => red
                                          Имя атрибута всегда в нижнем регистре.
                                          Значение атрибута может быть пустой
                                          строкой. Имя тега тоже присутствует в
                                          списке атрибутов. Это для того, чтобы
                                          можно было работать, например, с
                                          такими тегами - [color="#555555"]
                    )
                [layout] => Array                 // Это значение несуществует
                    (                             // для элементов типа 'text'.
                        [0] => Array              // Массив содержит пары
                            (                     // ( тип строки , строка )
                                [0] => 0          // Типы могут быть следующие:
                                [1] => [          // 0 - скобка ('[' или ']')
                            )                     // 1 - слэш '/'
                        ...                       // 2 - имя тега
                        [i] => Array              //     (например - 'font')
                            (                     // 3 - знак '='
                                [0] => тип строки // 4 - строка из пробельных
                                [1] => строка     //     символов
                            )                     // 5 - кавычка или апостроф,
                        ...                       //     ограничивающая значение
                                                  //     атрибута
                    )                             // 6 - имя атрибута
            )                                     // 7 - значение атрибута
        ...
    )

    Свойство syntax может помочь вам, во-первых, оптимизировать свои скрипты. Пример, как это сделать, смотрите выше. Во-вторых, это свойство будет вам полезно, если захотите реализовать какую-то нестандартную операцию над BBCode. Например, - вырезать все теги.
     
  • tree - массив, содержащий нормализованное дерево ББКода. Получается из syntax в результате его логического анализа:
    1. syntax преобразовывается в правильную скобочную структуру
    2. Затем преобразовываются в текст все элементы, которым запрещено находиться в данном месте. (Например, теги, вложенные в [nobb])
    3. Список элементов преобразуется в дерево.

    Структура массива "tree"
    Array
    (
        ...
        [i] => Array      i - целочисленный ключ начиная с 0
            (
                [type] => тип элемента. Может иметь только два значения: 'item'
                          и 'text'. В первом случае элемент соответствует
                          какому-то тегу. Во втором случае элемент является
                          строкой текста без тегов.
     
                [name] => имя тега в нижнем регистре. Например: 'h1'. [name]
                          определен только для элементов типа 'item' и
                          отсутствует для элементов типа 'text'.
     
                [attrib] => Array         Список значений атрибутов. Определен
                    (                     только для элементов типа 'item' и
                        ...               отсутствует для элементов типа 'text'.
                        ...
                        [имя атрибута] => значение атрибута. Например:
                        ...               [align] => center
                        ...               Имя атрибута всегда в нижнем регистре.
                                          Значение атрибута может быть пустой
                                          строкой. Имя тега тоже присутствует в
                                          списке атрибутов. Это для того, чтобы
                                          можно было работать, например, с
                    )                     такими тегами - [align=right]
     
                [val] => Array            Дерево подэлементов данного элемента.
                    (                     Существует только для элементов типа
                        ...               'item' и отсутствует для элементов
                        [i] => Array      типа 'text'. Структура полностью
                        ...               идентична структуре свойства
                        ...               $this->tree.
                    )
                [str] => строка текста без тегов.
                         Напрмер: 'Хорошо живет на свете Виннипух'.
                         [str] существует только для элементов типа 'text' и не
                         существует для элементов типа 'item'.
            )
        ...
    )

    Свойство tree содержит более полный разбор BBCode, чем свойство syntax. Но если из syntax возможно однозначно восстановить исходный текст BBCode, то из tree это, скорее всего, окажется невозможно.
     
    Вам может понадобиться свойство tree, если вы будете создавать свои теги.
     
  • tags - это свойство - ассоциированный массив пар
     
    'имя_тега' => имя класса, реализующего соответствующий тег

    Все теги, разрешенные в ББКоде, должны быть представлены в этом массиве. Следующий пример показывает, как можно исключить из обработки какой-либо тег:
     
    PHP
    // Обрабатываем текст BBCode без тега [h1]
    $text = '[h1]BBCode[/h1] Пишем про [b]ББКод[/b]';
    require_once 'ваш/путь/bbcode.lib.php';
    $bb = new bbcode;
    unset($bb->tags['h1']);
    $bb->parse($text);
    echo $bb->get_html();

    Процедура добавления тега несколько более сложна. Поэтому будет описана отдельно.
     
  • mnemonics - массив мнемоник - смайлики и прочие условные обозначения, которые должны заменяться на что-то. Ключ - мнемоника, значение - на что заменяется. Например:
     
    ':-)' => '<img src="smile.gif" />'

  • autolinks - опция, включающая автоматические ссылки. По умолчанию установлена в true (автоматические ссылки включены). Для отключения ссылок должна быть установлена в false.
     
    Пример:
    $text = 'Статья про [b]BBCode[/b] - http://www.pc.uz/documents/text/732.html';
    require_once 'ваш/путь/bbcode.lib.php';
    $bb = new bbcode($text);
    // Отключаем автоматические ссылки:
    $bb->autolinks = false;
    echo $bb->get_html() . '<br />';
    // Включаем автоматические ссылки:
    $bb->autolinks = true;
    echo $bb->get_html();

  • is_close - свойство, устанавливающее значение по умолчанию для дочерних классов (тегов), для которых означает следующее:
    • true  - данный тег всегда закрыт (например, - [hr])
    • false - данный тег может не быть закрытым

    Это свойство может понадобится вам при конструировании собственных тегов.
     
  • lbr - свойство, устанавливающее значение по умолчанию для дочерних классов (тегов), - число переводов строк, которые должны игнорироваться перед тегом. Это свойство может понадобится вам при конструировании собственных тегов. Например, тег [h1] сам по себе создает разрыв перед собой, значит обработчик должен проигнорировать перед ним один разрыв, поставленный пользователем в исходном коде. Этот факт указан в описании специального класса:
     
    PHP
    public $lbr = 1;

    По умолчанию значение этого свойства установлено в 0.
     
  • rbr - свойство, устанавливающее значение по умолчанию для дочерних классов (тегов), - число переводов строк, которые должны игнорироваться после тега. Это свойство может понадобится вам при конструировании собственных тегов. Например, тег [h1] сам по себе создает разрыв после себя, равный примерно двум переводам строк, значит обработчик, должен проигнорировать после него два разрыва, поставленных пользователем в исходном коде. Этот факт указан в описании специального класса:
     
    PHP
    public $rbr = 2;

    По умолчанию значение этого свойства установлено в 0.
     
  • behaviour - строка, указывающая модель поведения тега (в плане вложенности), которому сопоставлен экземпляр данного класса. Это свойство может понадобиться вам при создании собственных тегов. Модели поведения предусмотрены следующие:
    1. 'a' - ссылки, якоря. Представлена тегами [a], [url], [anchor], [google]. Эти теги характеризуются тем, что могут иметь вложенными любые линейные теги, кроме ссылок.
       
    2. 'caption' - заголовки таблиц. Представлена единственным тегом [caption].
       
    3. 'code'    - линейные контейнеры кода. Представлена тегами [bbcode] и [nobb]. Эти теги характеризуются тем, что не могут содержать никаких дочерних.
       
    4. 'div' - блочные элементы. Представлена тегами [align], [center], [quote] и др. Эти теги характеризуются тем, что могут содержать что угодно, но их непосредственными потомками не могут быть теги имеющие модель поведения 'caption', 'li', 'td' или 'tr'.
       
    5. 'hr' - горизонталные линии. Представлена единственным тегом [hr].
       
    6. 'img' - картинки. Представлена единственным тегом [img].
       
    7. 'li' - элементы списков. Представлена единственным тегом [*].
       
    8. 'p' - блочные элементы типа абзацев и заголовков. Представлена тегами [h1], [h2], [h3], [h4], [h5], [h6], [p]. Эти теги характеризуются тем, что могут содержать только линейные элементы и картинки.
       
    9. 'pre' - блочные контейнеры кода. Представлена тегами [code], [pre] и тегами подсветок синтаксиса. Эти теги характеризуются тем, что не могут содержать никаких дочерних.
       
    10. 'span' - линейные элементы. Представлена тегами [b], [i], [u], [font] и т.п. Эти теги характеризуются тем, что не могут содержать блочные элементы и закрываются, как только начинается блочный элемент.
       
    11. 'table' - таблицы. Представлена единственным тегом [table].
       
    12. 'td' - ячейки таблиц. Представлена тегами [td] и [th].
       
    13. 'tr' - строки таблиц. Представлена единственным тегом [tr].
       
    14. 'ul' - списки. Представлена тегами [list], [ol], [ul].

    Значение по умолчанию - 'div'.
     
  • stat - массив статистических данных по обрабатываемому BBCode:
     
    Text
    'time_parse'  => Время парсинга BBCode в секундах
    'time_html'   => Время генерации HTML в секундах
    'count_tags'  => Число обработанных тегов BBCode
    'count_level' => Максимальное число уровней вложенности тегов BBCode.
                     = 0, если BBCode не содержит тегов.

  • preg_autolinks - массив регулярных выражений, используемых для автоматических ссылок. Вот значение по умолчанию:
     
    Массив замен для автоматических ссылок
    $this->preg_autolinks = array(
        'pattern' => array(
            "'[\w\+]+://[A-z0-9\.\?\+\-/_=&%#:;]+[\w/=]+'si",
            "'([^/])(www\.[A-z0-9\.\?\+\-/_=&%#:;]+[\w/=]+)'si",
            "'[\w]+[\w\-\.]+@[\w\-\.]+\.[\w]+'si",
        ),
        'replacement' => array(
            '<a href="$0" target="_blank">$0</a>',
            '$1<a href="http://$2" target="_blank">$2</a>',
            '<a href="mailto:$0">$0</a>',
        ),
        'highlight' => array(
            '<span class="bb_autolink">$0</span>',
            '$1<span class="bb_autolink">$2</span>',
            '<span class="bb_autolink">$0</span>',
        ),
    );

    Здесь
    • preg_autolinks['pattern'] - массив регулярных выражений, которым должны соответствовать искомые в тексте ссылки.
       
    • preg_autolinks['replacement'] - массив шаблонов, по которым должны заменяться искомые в тексте ссылки.
       
    • preg_autolinks['highlight'] - массив шаблонов, используемый вместо preg_autolinks['replacement'] в режиме подсветки синтаксиса.

    Все три массива должны подчиняться синтаксису, установленному для функции
     
    preg_replace(pattern, replacement)

    Свойство preg_autolinks может понадобиться вам, если захотите улучшить автоматические ссылки. Например, если вы хотите спрятать email-ы от спамботов, можете воспользоваться таким кодом:
     
    PHP
    $bb->preg_autolinks['pattern'][2] = "'([\w]+[\w\-\.]+)@([\w\-\.]+\.[\w]+)'si";
    $bb->preg_autolinks['replacement'][2] = '$1(немецкая овчарка)$2';
Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2007-08-23 18:07:00

Метки материала: bbcode, xBB, PHP, API, tags, syntax, tree, mnemonics, autolinks, behaviour, preg_autolinks


9 комментариев

03.02.2012 12:07:33 #
Mozilla Firefox dima
Пожалуйста Well
03.02.2012 11:53:09 #
Mozilla Firefox Гость one
dima
Способ №2. Преобразуйте BBCode в HTML и примените strip_tags.

огромное спасибо Yes
03.02.2012 09:39:31 #
Mozilla Firefox dima
Способ №1. Все bb-теги можно вырезать довольно простой регуляркой.
Способ №2. Преобразуйте BBCode в HTML и примените strip_tags.
Способ №3. Напишите класс-обработчик тегов, который будет просто выдавать содержимое тега и назначьте его всем тегам.
Способ №4. Напишите функцию, которая будет принимать на вход массив $bbcode->tree и возвращать текст без тегов.
03.02.2012 02:02:47 #
Mozilla Firefox Гость one
Здравствуйте
 
как получить чистый текст без тегов bbcode(т.е. вырезать их и получить в переменную только текст)?
 

Заранее спасибо. Жду Вашего ответа) Well
22.01.2011 17:07:21 #
Mozilla Firefox dima
В смысле Вам нужен конвертер HTML в BBCode? Если пользуетесь моей библиотекой, то скорее всего достаточно будет следующего:
  1. выделить из HTML-страницы содержимое тега <body>,
  2. вырезать из нее все теги <script> вместе с содержимым,
  3. вырезать все HTML-комментарии,
  4. заменить угловые скобки на квадратные,
  5. заменить HTML-мнемоники (такие как &amp;, &lt; и т.п.) на соответствующие символы.
Должно работать.
22.01.2011 15:26:09 #
Mozilla Firefox Гость lola291
добрый день. Меня интерисует вопрос. можно ли исходный код страницы переконвертировать в bbcode?  помогите решить проблему
19.06.2009 20:20:45 #
Iceweasel dima
Если имеется в виду цитирование поста целиком, то поступайте так-же, как поступают на всех форумах: перегружают страницу и вставляют в текстарию код цитируемого сообщения, обрамляя его тегом [quote]
 
Если имеется в виду вставка в цитату произвольного текста со страницы, то ответ найдете здесь: Как создать кнопку цитирования для редактора BBCode.
19.06.2009 18:35:25 #
Opera alucard
Да и было бы дучше если б можно было мышко выделять то что будет цитироваться.
сори если не туда написал
19.06.2009 18:13:24 #
Opera Гость Alucard
Все вроде ясно и удобно, вот только как организовать цитату, то есть,  есть кнопочка "Цитировать" на каждом комментарии, и при нажатии чтоб в текстарее появлялся ббкод?

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2019, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.