Лучший способ проанализировать bbcode

Я хотел бы работать над фильтром bbcode для php веб-сайта. (Я использую cakephp, это был бы bbcode помощник), у меня есть некоторое требование.

Bbcodes может быть вложен. Таким образом, что-то как этот допустимо.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

Bbcodes может иметь 0 или больше параметров.

Exemple:

[video: url="url", width="500", height="500"]Title[/video]

Bbcodes мог бы иметь несколько поведений.

Позвольте говорят, [url]text[/url] был бы преобразован к [url:url="text"]text[/url] или видео bbcode смогло бы выбрать между YouTube, dailymotion....

Я думаю, что это удовлетворяет большинство моих потребностей. Я alreay, сделанный что-то с regex. Но моя самая большая проблема состояла в том, чтобы соответствовать параметрам. На самом деле я был вложен bbcode для работы и bbcode с 0 параметрами. Но когда я добавил соответствие regex для параметров, оно не соответствовало вложенному bbcode правильно.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" //Это не был.*, но non-gready matcher

У меня нет полного regex со мной прямо сейчас, Но у меня было что-то, что было похоже на это (выше).

Так есть ли способ соответствовать bbcode эффективно regex или чему-то еще. Единственная вещь, о которой я могу думать, состоит в том, чтобы использовать шаблон "посетитель" и разделять мой текст с каждым возможные теги этот путь, я могу иметь немного больше контроля своим текстовым парсингом, и я мог, вероятно, проверить свой документ поэтому, если входной текст не имеет допустимого bbcode. Я мог Уведомить пользователя с ошибкой прежде, чем сохранить что-либо.

Я использовал бы sablecc для создания моего текстового синтаксического анализатора. http://sablecc.org/

Какая-либо лучшая идея? или что-нибудь, что могло привести к эффективному гибкому bbcode синтаксическому анализатору?

Спасибо и жаль о моем плохом английском языке...

9
задан Luca Filosofi 13 August 2012 в 13:25
поделиться

4 ответа

Существует и pecl и ГРУША BBCode парсинг библиотеки. Программное обеспечение достаточно трудно, не переосмысливая годы работы самостоятельно.

Если бы ни один из тех не является опцией, я сконцентрировался бы на превращении BBCode в допустимую строку XML и затем использования Вашего любимого XML парсинг стандартной программы на этом. Очень очень общее представление здесь, но

  1. Выполните код через htmlspecialchars для выхода из любых объектов тот выход потребности

  2. Преобразуйте все [и] символы в <и> соответственно

  3. Не забывайте объяснять двоеточие в случаях как [tagname:

Если бы BBCode был вложен правильно, то Вы должны быть все установлены передать эту строку в XML, анализирующий объект (SimpleXML, DOMDocument, и т.д.)

6
ответ дан 4 December 2019 в 08:02
поделиться

Существует несколько существующих библиотек для парсинга BBCode, может быть легче изучить библиотеки, чем попытка к самокрутке:

Вот пара, я уверен, что существует больше, если Вы озираетесь:
PECL bbcode
ГРУША HTML_BBCodeParser

8
ответ дан 4 December 2019 в 08:02
поделиться

Ответ к: "Какая-либо лучшая идея?" (и я предполагаю, что это было приглашением не только для улучшения по сравнению с bbcode-определенными предложениями),

Мы недавно посмотрели на хождение bbcode путем и выбрали использование htmlpurifier вместо этого. Это решение базировалось частично на (по общему признанию смещено, вероятно) сравнения между различными методами, перечисленными htmlpurifier группой здесь и обсуждением bbcode (снова htmlpurifer группой) здесь

И для записи я думаю, что Ваш английский язык был очень хорош. Я уверен, что это намного лучше, чем я мог сделать на Вашем родном языке.

3
ответ дан 4 December 2019 в 08:02
поделиться

Используйте preg_split () с флагом PREG_DELIM_CAPTURE для разделения исходного кода на теги и не теги. Затем выполните итерацию по тегам, сохраняя стек открытых блоков (например, когда вы видите открывающий тег, добавьте его в массив. Когда вы видите закрывающий тег, удаляйте элементы с конца массива, пока закрывающий тег не совпадет с открывающим тегом.)

{{1 }}
2
ответ дан 4 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: