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-кодов
Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010
Помог: 3 раз(а)
Как правильней обращаться с бб кодами?
1. Парсить при отправке в базу
- т.е. в базу идет html
2. Парсить при выводе
- т.е. в базу идут бб коды
В обеих случаях появляется проблема с htmlspecialchars(), что делать с этой функцией, ведь нужна защита от xss.
DeepVarvar
Отправлено: 08 Августа, 2013 - 05:17:01
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Сделать в базе два поля - одно с сорцом, который будет редактироваться, если понадобится, другой уже с пропарсеными данными - эти будут выводиться на страницу.
Так будет минимальная нагрузка и максимальное удобство.
А на то что БД чутка вырастет в размерах можно наплевать.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
VestCoastman пишет:
В обеих случаях появляется проблема с htmlspecialchars(), что делать с этой функцией, ведь нужна защита от xss.
Какая проблема, если у вас BB?
Делаете htmlspecialchars, обрабатываете BB. Никакой проблемы.
----- PostgreSQL DBA
Unit221
Отправлено: 08 Августа, 2013 - 10:42:50
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2013
Помог: 0 раз(а)
Добрый день. Если я правельно понял вашу проблемую
Можно данные записать в фаил а потом прочитать их вывести пользавателю и удалить фаил.
А данные после функции htmlspecialchars() записать в БД.
VestCoastman
Отправлено: 08 Августа, 2013 - 14:53:12
Посетитель
Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010
Помог: 3 раз(а)
DeepVarvar пишет:
Сделать в базе два поля - одно с сорцом, который будет редактироваться, если понадобится, другой уже с пропарсеными данными - эти будут выводиться на страницу.
Так будет минимальная нагрузка и максимальное удобство.
А на то что БД чутка вырастет в размерах можно наплевать.
Не совсем понял суть(структуру построения), но меня это заинтересовало, т.к. стремлюсь к минимальной нагрузке.
Мелкий пишет:
Какая проблема, если у вас BB?
Делаете htmlspecialchars, обрабатываете BB. Никакой проблемы.
Ну да, чуть-чуть ошибся, но в таком случае, нагрузка будет огромная, это ж пока одно сообщение preg_replace, пока другое. А если сообщений, например, 50 на странице?
Мелкий
Отправлено: 08 Августа, 2013 - 15:05:20
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
VestCoastman пишет:
Не совсем понял суть
Суть - держите 2 поля в таблице. Одно - исходное сообщение, второе - обработанное и пригодное к немедленному выводу.
VestCoastman пишет:
А если сообщений, например, 50 на странице?
Ну и что? Кэшируйте, если получение свежей копии дороже затрат на кэширование. Один из вариантов кеширования уже предложен - хранить сразу в базе обработанный вид.
Unit221 пишет:
Можно данные записать в фаил а потом прочитать их вывести пользавателю и удалить фаил.
Какой файл? Зачем файл?
----- PostgreSQL DBA
VestCoastman
Отправлено: 08 Августа, 2013 - 15:36:51
Посетитель
Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010
Помог: 3 раз(а)
Мелкий пишет:
VestCoastman пишет:
Не совсем понял суть
Суть - держите 2 поля в таблице. Одно - исходное сообщение, второе - обработанное и пригодное к немедленному выводу.
А для чего хранить обработанное? Если на выводе его ждет htmlspecialchars(), которая не позволит выводить html
Мелкий
Отправлено: 08 Августа, 2013 - 15:43:38
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Почему его на выходе ждёт htmlspecialchars?
Если он уже был применён при обработке и перед записью в базу?
Для чего - оптимизация под более частое чтение, нежели запись. Перед записью обрабатываете данные, сохраняете вместе с новым оригиналом сообщения. При выводе - просто выводите уже обработанный кусок.
----- PostgreSQL DBA
VestCoastman
Отправлено: 08 Августа, 2013 - 15:47:36
Посетитель
Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010
Помог: 3 раз(а)
Мелкий пишет:
Почему его на выходе ждёт htmlspecialchars?
Если он уже был применён при обработке и перед записью в базу?
Я такого не говорил.
Т.е. вы предлагаете хранить &" - это в базе?
Мелкий
Отправлено: 08 Августа, 2013 - 16:02:16
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
VestCoastman пишет:
Я такого не говорил.
Так это мы с DeepVarvar'ом говорим.
VestCoastman пишет:
Т.е. вы предлагаете хранить &" - это в базе?
Именно.
Неудобное решение вопроса обновить сообщения согласно обновившемуся парсеру, но парсер обновляется ещё реже, чем сообщения.
----- PostgreSQL DBA
VestCoastman
Отправлено: 08 Августа, 2013 - 16:22:31
Посетитель
Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010
Помог: 3 раз(а)
Мелкий пишет:
VestCoastman пишет:
Т.е. вы предлагаете хранить &" - это в базе?
Именно.
Неудобное решение вопроса обновить сообщения согласно обновившемуся парсеру, но парсер обновляется ещё реже, чем сообщения.
Допустим это так. Мы записываем в базу такой код, например
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
VestCoastman пишет:
В итоге, мы получим примерно такой вывод на страницу
Ну и куда amp потеряли?
Да, где это требуется, при обработке BB понадобится сделать htmlspecialchars_decode.
Или BB обрабатывать, прогоняя всё, что остаётся от текста текстом через htmlspecialchars. Смотря что удобнее будет.
----- PostgreSQL DBA
VestCoastman
Отправлено: 08 Августа, 2013 - 17:16:35
Посетитель
Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010
Помог: 3 раз(а)
Мелкий пишет:
VestCoastman пишет:
В итоге, мы получим примерно такой вывод на страницу
Ну и куда amp потеряли?
Случайно стер)
Хорошо, тогда другой вопрос, как обработать амперсанд (&)? Ведь preg_replace съедает каждый символ, а не всю строку &. Например как в регулярке выше
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Добавьте соответствующие символы с символьный класс. А жадность сделает своё дело. Валидировать ссылку можете в callback'е preg_replace_callback. Валидация имеющейся делается куда проще выделения ссылки из произвольного текста. Если случайно ухватили не ссылку - просто вернёте значение обратно.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.