Вопрос

Я хотел бы поработать над фильтром 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....

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

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // Это было не так . * но нежирный совпадающий

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

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

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

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

Спасибо вам и извините за мой плохой английский...

Это было полезно?

Решение

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

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

  1. Запустите код через htmlspecialchars, чтобы избежать любых объектов, которые нуждаются в экранировании

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

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

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

Другие советы

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

Вот пара, я уверен, что есть и другие, если вы посмотрите вокруг:
PECL bbcode ( Код )
PEAR html_bbbcodeparser - анализатор ГРУШЕВОГО кода

Сам изучал парсеры bbcode.Большинство из них используют regex и PHP4 и выдают ошибки на PHP 5.2+ или вообще не работают.PECL bbcode и PEAR HTML_BBCodeParser, похоже, больше не поддерживаются (конец 2012 года) и их нелегко установить на общий хостинг, с которым мне приходится работать. StringParser_BBCode работает с некоторыми незначительными изменениями для версии 5.2+, но метод добавления новых тегов неуклюж, и в последний раз он обновлялся в 2008 году.

Похоронен на 4-й странице поиска в Bing (я был в отчаянии) Я нашел JBB - код, который выглядит новым и требует PHP 5.3.МИТ Лизенс.Я еще не пробовал создавать пользовательские теги, но пока это единственное, что я пробовал, которое работает "из коробки" в общей учетной записи хостинга с PHP 5.3.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top