Простой BBparser в PHP, который позволяет заменять контент вне тегов - PullRequest
0 голосов
/ 03 апреля 2011

Я пытаюсь разобрать строки, которые представляют исходный код, что-то вроде этого:

[code lang="html"]
  <div>stuff</div>
[/code]
<div>stuff</div>

Как вы можете видеть из моих предыдущих 20 вопросов, я пытался сделать это с помощью функций регулярного выражения PHP, но столкнулся со многими проблемами, особенно когда строка очень большая ...

Ребята, вы знаете класс BB-парсера, написанный на PHP, который я могу использовать для этого вместо регулярных выражений?

Что мне нужно сделать, это:

  • сможет конвертировать весь контент из тегов [code] с HTML-сущностями
  • сможет запускать какой-то фильтр (мою функцию обратного вызова) только для содержимого вне тегов [code]

спасибо

редактирование: Я закончил, используя это:

  • преобразовать все теги <pre> и <code> в [pre] и [code]:

    <code>str_replace(array('<pre>', '
    ',' ', ' '), массив (' [pre] ',' [/ pre] ',' [code] ',' [/ code] '), $ content);
  • получить содержимое между [code] .. [/ code] и [pre] ... [/ pre] и выполнить преобразование html-сущности

    preg_replace_callback('/(.?)\[(pre|code)\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)/s', 'self::specialchars', $content);
    

    (я украл этот шаблон из функций шорткода WordPress:)

  • сохранить содержимое, преобразованное объектами, во временную переменную массива и заменить одно из $content уникальным идентификатором

  • Теперь я могу безопасно запускать свой фильтр на $content, потому что в нем нет кода, только идентификатор (этот фильтр делает strip_tags для всего текста и преобразует такие вещи, как http://blabla.com в ссылки)

  • заменить уникальные идентификаторы из $content на преобразованные кодовые блоки из переменной массива

Как вы думаете, это нормально?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

Очиститель HTML http://htmlpurifier.org/

Но вы сталкиваетесь с такими же проблемами, как и в 20 предыдущих вопросах.

1 голос
/ 03 апреля 2011

Вы, ребята, знаете класс BB-парсера, написанный на PHP, который я могу использовать для этого вместо регулярных выражений?

Существует расширение BBCode PECL , но вам нужно его скомпилировать.

Также есть PEAR's HTML_BBCodeParser , хотя я не могу поручиться за его эффективность.

Есть также несколько других, но я думаю, что они все довольно жесткие.

Я не верю, что либо из них делают то, что вы ищете, в отношении обратного вызова для содержимого тега (и тогда @webarto полностью правильно в этот HTMLPurifier является правильным инструментом для использования при обработке содержимого). Вы могли бы написать здесь свое. Ранее я писал о своем опыте, связанном с тем же , который вам может пригодиться.

...