Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BBcode проверка и замена 
V
    Опции темы
Staind
Дата 10.3.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



Есть проверка на тэги bbcode.
Вот так реализовано:
Код

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


Но если я введу строку так (скобки - это означает что символы находятся в bbcode): "(вцфв)цфвццвффу(пкырк)", то у меня закрашивается жирным вся строка "(вцфвцфвццвффупкырк)" после обработки. Незнаю почему так. Конечно здесь скорее всего в выражении проблема. Люди добрые подскажи как этого избежать?
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
skyboy
Дата 10.3.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



я вообще удивляюсь, что данній код что-то обрабатывает. вообще-то, у preg_replace первым параметром идет - что искать, а уже вторым - на что заменять. у тебя же - наоборот...
PM MAIL   Вверх
flashaa
Дата 10.3.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Во-первых, первый и второй параметр поменять местами.
Код

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

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

Это сообщение отредактировал(а) flashaa - 10.3.2008, 23:30
PM MAIL   Вверх
Staind
Дата 10.3.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



2skyboy, да, я его случайно написал на форум неправильно. В самом коде в плане расстановки норм.
А как чтобы нормально было?)
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
SelenIT
Дата 11.3.2008, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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

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

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



--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
flashaa
Дата 11.3.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



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 '...':
    }
}



Это сообщение отредактировал(а) flashaa - 11.3.2008, 10:50
PM MAIL   Вверх
Staind
Дата 11.3.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



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

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

Это сообщение отредактировал(а) Staind - 11.3.2008, 14:28
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
SelenIT
Дата 11.3.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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

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

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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
flashaa
Дата 11.3.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



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


Это сообщение отредактировал(а) flashaa - 11.3.2008, 14:52
PM MAIL   Вверх
Staind
Дата 11.3.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



2flashaa, спасибо большое, все получилось  smile  smile 
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
Staind
Дата 11.3.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



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

Это сообщение отредактировал(а) Staind - 11.3.2008, 19:35
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
Sanchezzz
  Дата 11.3.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



как хочешь лучше в бб кодах а в скрипте менять уже на код картинки и так и так одинаковая скорость.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Staind
Дата 11.3.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: 2
Всего: 3



2Sanchezzz, благодарю, тогда в bbcod'ах буду хранить.
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
flashaa
Дата 12.3.2008, 10:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Я думаю НЕ стоит хранить в html, т.к. надо оставлять себе свободу на будущее. К примеру в один прекрасный день ты захочишь выключить BB-теги или по-другому их обрабатывать. Тогда ты просто поменяешь код обработки. А если в базе сохранен сразу html, то с ним уже ничего не сделаешь. К тому же хранить html вообще опасно, лучше проверять и форматировать перед выводом - чуть более ресурсоемко, но надежо и хорошо управляемо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.