bbcode unparser regex help - PullRequest
       6

bbcode unparser regex help

2 голосов
/ 17 июля 2010

У меня есть эта функция для разбора 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?

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

Спасибо.

Ответы [ 3 ]

7 голосов
/ 17 июля 2010

Не.

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

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

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

3 голосов
/ 17 июля 2010

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

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

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

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

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

...