У меня есть эта функция для синтаксического анализа 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?
Мои навыки регулярного выражения плохие 🙁
Благодарю.
Не.
Вместо этого сохраните как оригинальный текст, не обработанный, так и обработанный разобранный текст. Да, это удваивает требования к хранению, но также делает его ослепительно легким:
Можно с уверенностью сказать, что практически невозможно построить надежный способ конвертировать html в bbcode с помощью всего лишь множества регулярных выражений. Используйте парсер (например, DOMDocument), удалите недопустимые элементы и атрибуты с помощью xpath и проверите, а затем рекурсивно пройдите по нему, создав строку bbcode на этом пути (или просто игнорируйте недопустимые теги / атрибуты на этом пути).
Если вы точно знаете, что HTML-код, который вы хотите де-bbcode, был en-bbcoded, используя ваш метод, а затем выполните следующие действия:
Переключите два массива, которые вы передаете в preg_replace
.
В массиве с кодом HTML выполните следующие действия для каждого элемента: Подготовьте #
к строке. Добавить #. Замените \1
(и \2
aso) на (.*?)
.
Для массива с bb-кодами делаем следующее с каждым элементом: Remove /
в начале и /ms
в конце. Замените \s
на , Удалите все
\
. Удалить все ?
, Замените первый (.*)
В строке на $1
а второй – на $2
.
Это должно быть сделано. Если возникнут проблемы: Ask;)