Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Хранение и парсинг BB-кодов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
VestCoastman
Отправлено: 08 Августа, 2013 - 04:06:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Как правильней обращаться с бб кодами?
1. Парсить при отправке в базу
- т.е. в базу идет html

2. Парсить при выводе
- т.е. в базу идут бб коды

В обеих случаях появляется проблема с htmlspecialchars(), что делать с этой функцией, ведь нужна защита от xss.
 
 Top
DeepVarvar Супермодератор
Отправлено: 08 Августа, 2013 - 05:17:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Сделать в базе два поля - одно с сорцом, который будет редактироваться, если понадобится, другой уже с пропарсеными данными - эти будут выводиться на страницу.
Так будет минимальная нагрузка и максимальное удобство.
А на то что БД чутка вырастет в размерах можно наплевать.
 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 10:28:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




VestCoastman пишет:
В обеих случаях появляется проблема с htmlspecialchars(), что делать с этой функцией, ведь нужна защита от xss.

Какая проблема, если у вас BB?
Делаете htmlspecialchars, обрабатываете BB. Никакой проблемы.


-----
PostgreSQL DBA
 
 Top
Unit221
Отправлено: 08 Августа, 2013 - 10:42:50
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




Добрый день. Если я правельно понял вашу проблемую

Можно данные записать в фаил а потом прочитать их вывести пользавателю и удалить фаил.

А данные после функции htmlspecialchars() записать в БД.
 
 Top
VestCoastman
Отправлено: 08 Августа, 2013 - 14:53:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




DeepVarvar пишет:
Сделать в базе два поля - одно с сорцом, который будет редактироваться, если понадобится, другой уже с пропарсеными данными - эти будут выводиться на страницу.
Так будет минимальная нагрузка и максимальное удобство.
А на то что БД чутка вырастет в размерах можно наплевать.

Не совсем понял суть(структуру построения), но меня это заинтересовало, т.к. стремлюсь к минимальной нагрузке.
Мелкий пишет:
Какая проблема, если у вас BB?
Делаете htmlspecialchars, обрабатываете BB. Никакой проблемы.

Ну да, чуть-чуть ошибся, но в таком случае, нагрузка будет огромная, это ж пока одно сообщение preg_replace, пока другое. А если сообщений, например, 50 на странице? Ниндзя
 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 15:05:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




VestCoastman пишет:
Не совсем понял суть

Суть - держите 2 поля в таблице. Одно - исходное сообщение, второе - обработанное и пригодное к немедленному выводу.

VestCoastman пишет:
А если сообщений, например, 50 на странице?

Ну и что? Кэшируйте, если получение свежей копии дороже затрат на кэширование. Один из вариантов кеширования уже предложен - хранить сразу в базе обработанный вид.

Unit221 пишет:
Можно данные записать в фаил а потом прочитать их вывести пользавателю и удалить фаил.

Какой файл? Зачем файл?


-----
PostgreSQL DBA
 
 Top
VestCoastman
Отправлено: 08 Августа, 2013 - 15:36:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Мелкий пишет:
VestCoastman пишет:
Не совсем понял суть

Суть - держите 2 поля в таблице. Одно - исходное сообщение, второе - обработанное и пригодное к немедленному выводу.

А для чего хранить обработанное? Если на выводе его ждет htmlspecialchars(), которая не позволит выводить html
 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 15:43:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Почему его на выходе ждёт htmlspecialchars?
Если он уже был применён при обработке и перед записью в базу?

Для чего - оптимизация под более частое чтение, нежели запись. Перед записью обрабатываете данные, сохраняете вместе с новым оригиналом сообщения. При выводе - просто выводите уже обработанный кусок.


-----
PostgreSQL DBA
 
 Top
VestCoastman
Отправлено: 08 Августа, 2013 - 15:47:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Мелкий пишет:
Почему его на выходе ждёт htmlspecialchars?
Если он уже был применён при обработке и перед записью в базу?

Я такого не говорил.
Т.е. вы предлагаете хранить &" - это в базе?
 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 16:02:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




VestCoastman пишет:
Я такого не говорил.

Так это мы с DeepVarvar'ом говорим.

VestCoastman пишет:
Т.е. вы предлагаете хранить &" - это в базе?

Именно.
Неудобное решение вопроса обновить сообщения согласно обновившемуся парсеру, но парсер обновляется ещё реже, чем сообщения.


-----
PostgreSQL DBA
 
 Top
VestCoastman
Отправлено: 08 Августа, 2013 - 16:22:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Мелкий пишет:
VestCoastman пишет:
Т.е. вы предлагаете хранить &" - это в базе?

Именно.
Неудобное решение вопроса обновить сообщения согласно обновившемуся парсеру, но парсер обновляется ещё реже, чем сообщения.


Допустим это так. Мы записываем в базу такой код, например
CODE (text):
скопировать код в буфер обмена
  1. http://forum.php.su/topic.php?forum=71&topic=11526

Обрабатываем его htmlspecialchars(), получаем
CODE (text):
скопировать код в буфер обмена
  1. http://forum.php.su/topic.php?forum=71&_amp;topic=11526

И после этого мы ее обрабатываем функцией, например bbcode(), которая выделяет ссылки
(((ht|f)tps?:\/\/)[\w\/\?\.\=\&]+)/is -патерн

В итоге, мы получим примерно такой вывод на страницу
CODE (text):
скопировать код в буфер обмена
  1. http://forum.php.su/topic.php?forum=71&;topic=11526

А?!
 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 16:39:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




VestCoastman пишет:
В итоге, мы получим примерно такой вывод на страницу

Ну и куда amp потеряли?

Да, где это требуется, при обработке BB понадобится сделать htmlspecialchars_decode.
Или BB обрабатывать, прогоняя всё, что остаётся от текста текстом через htmlspecialchars. Смотря что удобнее будет.


-----
PostgreSQL DBA
 
 Top
VestCoastman
Отправлено: 08 Августа, 2013 - 17:16:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Мелкий пишет:
VestCoastman пишет:
В итоге, мы получим примерно такой вывод на страницу

Ну и куда amp потеряли?

Случайно стер)
Хорошо, тогда другой вопрос, как обработать амперсанд (&)? Ведь preg_replace съедает каждый символ, а не всю строку &. Например как в регулярке выше
PHP:
скопировать код в буфер обмена
  1. preg_replace('/(((ht|f)tps?:\/\/)[\w\/\?\.\=\&]+)/is', '<a href="$1">$1</a>', $text)
  2. В патерне
  3. [\w\/\?\.\=\&]+

Должен обрабатываться не "&", а "&amp;"
 
 Top
VestCoastman
Отправлено: 08 Августа, 2013 - 20:36:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Есть предложения, как исправить амперсанд в регулярке?

(Отредактировано автором: 05 Сентября, 2013 - 23:47:08)

 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 21:16:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Добавьте соответствующие символы с символьный класс. А жадность сделает своё дело. Валидировать ссылку можете в callback'е preg_replace_callback. Валидация имеющейся делается куда проще выделения ссылки из произвольного текста. Если случайно ухватили не ссылку - просто вернёте значение обратно.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB