Проблема разбора BBcode - PullRequest
       20

Проблема разбора BBcode

0 голосов
/ 21 мая 2011

Я использую эту функцию для разбора BBcode:

function bbcode ($message) {
$search = array(
'@\[(?i)b\](.*?)\[/(?i)b\]@si',
'@\[(?i)i\](.*?)\[/(?i)i\]@si',
'@\[(?i)u\](.*?)\[/(?i)u\]@si',
'@\[color=rgb(.*?)\](.*?)\[\/color\]@si',
'@\[quote](.*?)\[\/quote\]@si',
'@\[li](.*?)\[\/li\]@si',
'@\[ul](.*?)\[\/ul\]@si',
);

$replace = array(
'<b>\\1</b>',
'<i>\\1</i>',
'<u>\\1</u>',
'<span style=\"color:rgb\\1\">\\2</span>',
'<span class=\"quote">\\1</span>',
'<li>\\1</li>',
'<ul>\\1</ul>',
);
return preg_replace($search , $replace, $message);
}

В большинстве случаев работает нормально, но не всегда.

Например:

[color=rgb(102, 0, 102)]H[color=rgb(204, 0, 0)]e[/color]llo[/color]

Результат:

<span style="color:rgb(102, 0, 102)">H[color=rgb(204, 0, 0)]e</span>llo[/color]

Как видите, только первый [color = ...] [/ color] был преобразован в html. Второй остается как есть. Есть идеи?

1 Ответ

0 голосов
/ 21 мая 2011

Работает правильно, как вы указали.Проблема со встроенными последовательностями.Я предлагаю вам выполнить две замены.Один для начальных тегов и один для конечных.Возможно, вам также удастся указать сначала все начальные теги, а все конечные теги - последние в массиве замен.Это в любом случае делает значения поиска-замены проще, и в большинстве случаев вам не нужно использовать обратные ссылки, особенно для таких простых тегов, как [b].Это должно исправить вашу проблему.

...