htmlentities()
не разбирает. Скорее, он кодирует данные, чтобы их можно было безопасно отображать в HTML-документе.
Ваш код будет выглядеть так:
- Разбор BB-кода (по какому-то механизму); пока не выполняйте экранирование, просто разберите входной текст на теги!
- Результатом вашего шага синтаксического анализатора будет некоторая древовидная структура, состоящая из узлов, представляющих теги блоков, и узлов, представляющих простой текст (текст между тегами).
- Отобразить дерево в выходной формат (HTML). На этом этапе вы экранируете обычный текст в своей структуре данных, используя
htmlentities
.
Ваша функция рендеринга будет рекурсивной. Некоторые псевдофункции, которые определяют отношения:
render( x : plain text ) = htmlentities(x)
render( x : bold tag ) = "<b>" . render( get_contents_of ( x )) . "</b>"
render( x : quote tag ) = "<blockquote>" .
render( get_contents_of( x )) .
"</blockquote>"
...
render( x : anything else) = "<b>Invalid tag!</b>"
Итак, вы видите, htmlentities
вступает в игру только тогда, когда вы выводите свой вывод в HTML, поэтому браузер не запутается, если ваш обычный текст должен содержать специальные символы, такие как <и>. Если бы вы рендерили в простой текст, вы бы вообще не использовали вызов функции, например.