Справка по расшифровке bbcode unparser

У меня есть эта функция для синтаксического анализа bbcode -> html:

$this->text = preg_replace(array( '/\[b\](.*?)\[\/b\]/ms', '/\[i\](.*?)\[\/i\]/ms', '/\[u\](.*?)\[\/u\]/ms', '/\[img\](.*?)\[\/img\]/ms', '/\[email\](.*?)\[\/email\]/ms', '/\[url\="?(.*?)"?\](.*?)\[\/url\]/ms', '/\[size\="?(.*?)"?\](.*?)\[\/size\]/ms', '/\[youtube\](.*?)\[\/youtube\]/ms', '/\[color\="?(.*?)"?\](.*?)\[\/color\]/ms', '/\[quote](.*?)\[\/quote\]/ms', '/\[list\=(.*?)\](.*?)\[\/list\]/ms', '/\[list\](.*?)\[\/list\]/ms', '/\[\*\]\s?(.*?)\n/ms' ),array( '<strong>\1</strong>', '<em>\1</em>', '<u>\1</u>', '<img src="\1" alt="\1" />', '<a href="mailto:\1">\1</a>', '<a href="\1">\2</a>', '<span style="font-size:\1%">\2</span>', '<object width="450" height="350"><param name="movie" value="\1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="\1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="350"></embed></object>', '<span style="color:\1">\2</span>', '<blockquote>\1</blockquote>', '<ol start="\1">\2</ol>', '<ul>\1</ul>', '<li>\1</li>' ),$original); 

Проблема в том, как разглядеть это, как html -> bbcode?

Мои навыки регулярного выражения плохие 🙁

Благодарю.

Не.

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

  1. Разрешить редактирование пользователем оригинала без разбора BBCode.
  2. Разрешить кавычки других сообщений пользователя, без синтаксического анализа
  3. Измените HTML каждый BBCode генерирует (просто повторно разобрать каждый пост)
  4. Переключайте BBCode двигатели вниз по линии (опять же, просто перебирайте каждый пост)

Можно с уверенностью сказать, что практически невозможно построить надежный способ конвертировать html в bbcode с помощью всего лишь множества регулярных выражений. Используйте парсер (например, DOMDocument), удалите недопустимые элементы и атрибуты с помощью xpath и проверите, а затем рекурсивно пройдите по нему, создав строку bbcode на этом пути (или просто игнорируйте недопустимые теги / атрибуты на этом пути).

Если вы точно знаете, что HTML-код, который вы хотите де-bbcode, был en-bbcoded, используя ваш метод, а затем выполните следующие действия:

Переключите два массива, которые вы передаете в preg_replace .

В массиве с кодом HTML выполните следующие действия для каждого элемента: Подготовьте # к строке. Добавить #. Замените \1\2 aso) на (.*?) .

Для массива с bb-кодами делаем следующее с каждым элементом: Remove / в начале и /ms в конце. Замените \s на , Удалите все \ . Удалить все ? , Замените первый (.*) В строке на $1 а второй – на $2 .

Это должно быть сделано. Если возникнут проблемы: Ask;)