Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > BBcode проверка и замена


Автор: Staind 10.3.2008, 22:19
Есть проверка на тэги bbcode.
Вот так реализовано:
Код

$string = preg_replace ("\\1", "#(?i)\(.*)\#", $string);


Но если я введу строку так (скобки - это означает что символы находятся в bbcode): "(вцфв)цфвццвффу(пкырк)", то у меня закрашивается жирным вся строка "(вцфвцфвццвффупкырк)" после обработки. Незнаю почему так. Конечно здесь скорее всего в выражении проблема. Люди добрые подскажи как этого избежать?

Автор: skyboy 10.3.2008, 23:29
я вообще удивляюсь, что данній код что-то обрабатывает. вообще-то, у http://ua.php.net/preg_replace первым параметром идет - что искать, а уже вторым - на что заменять. у тебя же - наоборот...

Автор: flashaa 10.3.2008, 23:29
Во-первых, первый и второй параметр поменять местами.
Код

$string = preg_replace ("#(?i)\(.*)\#", "\\1", $string);

Во-вторых при чем здесь bbcode?  Вычленяются строки между вот такими слешами "\" (включительно) и заменяются на внутренность слешей.
А (?i) - для понта? К сведенью, эти символы включают режим регистронезависимости после них. 

Автор: Staind 10.3.2008, 23:53
2skyboy, да, я его случайно написал на форум неправильно. В самом коде в плане расстановки норм.
А как чтобы нормально было?)

Автор: SelenIT 11.3.2008, 00:09
Staind, что-то я не понял, у тебя BB-коды выделяются круглыми скобками, а не квадратными, как обычно?

Прикол с (?i) тоже не понял... может, имелось в виду незахватывающее совпадение (?:что-то)?

Приведи пример реальных исходных данных, и что должно получиться после обработки. А то описание проблемы как-то сумбурно выглядит...

Автор: flashaa 11.3.2008, 10:48
Staind, обычно bbcode это нечто, похожее на тег, но в квадратных скобках. 
Поскольку теги сильно отличаются по смыслу, то универсальный вычленитель должен работать через вызовы callback-функций.
Код

$string = preg_replace("#\[(\w+)\](.*?)\[/\\1\]#ie", "bbcode_replace_callback('$1', '$2');", $string);

Здесь находятся теги типа b.../b, i../i и им подобные. 
После того, как строки находятся, из забирается имя тега (для моих примеров это "B, "I") и содержимое тега (то, что между  и ).
Эти 2 величины передаются в функцию bbcode_replace_callback, которую надо написать самому.
Ф-ция может выглядеть примерно так:
Код

function bbcode_replace_callback($tag, $innerText) {
    $tag = strtolower($tag);
    switch ($tag) {
        // Однотипные теги в одной группе
        case 'b':
        case 'i':
        case 'u':

            return '<' . $tag . '>' . $innerText . '</' . $tag . '>';
       
        // Другие группы тегов
        // case '...':
    }
}


Автор: Staind 11.3.2008, 14:25
2flashaa, спасибо, буду пробовать. Честно говоря даже и не знал что нужно создавать пользовательскую функцию. У Вас очень грамматно написано^^

2SelenIT, я понял что в квадратных. На форуме не смог написать примеры с квадратными скобками, поэтому, прежде чем писал код написал "скобки - это означает что символы находятся в bbcode"
Модификатор (?i) поставил затем, чтобы были регистронезависемые b,i,u...

Автор: SelenIT 11.3.2008, 14:34
Цитата(flashaa @  10.3.2008,  23:29 Найти цитируемый пост)
А (?i) - для понта? К сведенью, эти символы включают режим регистронезависимости после них. 

Цитата(Staind @  11.3.2008,  14:25 Найти цитируемый пост)
Модификатор (?i)

Ух ты, надо же, сколько лет пользуюсь регами - не знал про установку внутренних опций smile. Спасибо!

Автор: flashaa 11.3.2008, 14:37
SelenIT, но все равно какой смысл туда его ставить? Такие штуки ставятся, когда часть регулярки работает по одним правилам, другая часть - по другим. В данном случае это просто модификатор /i.
По поводу тегов - сейчас заметил, что в моем посте половина пропала, форум съел ) Теперь понятно, почему в первом посте через скобки.
Staind, потестил код на нескольких примерах, вроде работает. Хотя возможны скрытые баги.

Код

$string = 'before [some]mysql[/some]after';
$string = preg_replace("#\[(\w+)\](.*?)\[/\\1\]#ie", "bbcode_replace_callback('$1', '$2');", $string);

function bbcode_replace_callback($tag, $innerText) {
    $tag = strtolower($tag);
    switch ($tag) {
        // Однотипные теги в одной группе
        case 'b':
        case 'i':
        case 'u':
            return '<' . $tag . '>' . $innerText . '</' . $tag . '>';
       
        // Другие группы тегов
        // case '...':
        default:
            return '<' . $tag . '>' . $innerText . '</' . $tag . '>';
    }
}

echo $string;


Выводит:
Код

before <some>mysql</some>after

Автор: Staind 11.3.2008, 16:17
2flashaa, спасибо большое, все получилось  smile  smile 

Автор: Staind 11.3.2008, 19:35
Ув. люди, еще мелкий вопрос:
Я тут подумал, а в самой MySQL базе как хранить информацию? Хранить в реальных тэгах или в bbcode тэгах?
У меня сейчас сделано так:
После редактирования я все bbcode тэги перевожу на html тэги.
А думаю сделать так:
После редактирования сохраняются все bbcode Тэги как есть и при отображении информации они уже меняются на html тэги. Как лучше?
Я просто посмотрел исходники phpBB3 и у них там по идее сохраняется как есть а уже при отображении идет перевод в html тэги.
И так же хотел спросить - А много ли будет кушать ресурсов, если при отображении заменять?)))

Автор: Sanchezzz 11.3.2008, 19:54
как хочешь лучше в бб кодах а в скрипте менять уже на код картинки и так и так одинаковая скорость.

Автор: Staind 11.3.2008, 19:58
2Sanchezzz, благодарю, тогда в bbcod'ах буду хранить.

Автор: flashaa 12.3.2008, 10:27
Я думаю НЕ стоит хранить в html, т.к. надо оставлять себе свободу на будущее. К примеру в один прекрасный день ты захочишь выключить BB-теги или по-другому их обрабатывать. Тогда ты просто поменяешь код обработки. А если в базе сохранен сразу html, то с ним уже ничего не сделаешь. К тому же хранить html вообще опасно, лучше проверять и форматировать перед выводом - чуть более ресурсоемко, но надежо и хорошо управляемо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)