Sla
|
|
« : 16-11-2011 10:50 » |
|
Есть текст содержащий кавычки, апострофы, амперсанды
Бла "бла" 'бла' &бла& <a href="адрес ссылки, может содержать & ">ссылка может содержать спецсимволы</a> <любой текст в знаках больше меньше> <img src="адрес картинки может содержать &" alt="" />, а таже другие элементы разметки html, с атрибутами, значение которых заключается в двойные/одинарные кавычки
Чтобы все правильно выводилось и работало необходимо спецсимволы в тексте заменить на их html сущности, но в тегах их не трогать, только амперсанд (&)
Кодировка UTF-8
htmlspecialchars( текст, ENT_QUOTES, 'UTF-8') htmlentities
Действуют на весь текст
Может как-то попытаться разрулить ситуацию регулярными выражениями с callback'ом (preg_replace_callback) Но здесь стоит вопрос о правильном регулярном выражении Попробовал несколько вариантов что-то не выходит каменный цветок
Как написать регулярку, чтоб не затронуть параметры тегов. Т.е. теги исключить из процесса замены.
|
|
« Последнее редактирование: 16-11-2011 11:52 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zubr
Гость
|
|
« Ответ #1 : 16-11-2011 11:53 » |
|
А если вместо htmlspecialchars делать urlencode/urldecode ?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #2 : 16-11-2011 11:57 » |
|
Здесь вопрос не в параметрах url
пример текста <span class="c1">текст в "span" </span> текст после "спан" <a href="address">название</a>
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 16-11-2011 12:21 » |
|
Ну, если в тексте не в встречается "<", то он с большой вероятностью восстановим. Слав, попробуй tidy. Вроде он до HTML восстанавливает, а уж атрибуты потом можно регулярками поправить до XHTML.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #4 : 16-11-2011 13:09 » |
|
текста не очень много, до 1к символов можно распарсить html парсером, все текстовые ноды привести кправильному виду, и завернуть все обратно
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 16-11-2011 15:21 » |
|
http://ru.php.net/manual/en/book.tidy.phpОн для того и создан, чтобы кривой HTML исправлять. Добавлено через 1 минуту и 46 секунд:Слав, а это ты разовую работу выполняешь или что-то автоматизируешь от патологических искривлений?
|
|
« Последнее редактирование: 16-11-2011 15:23 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #6 : 16-11-2011 15:40 » |
|
условно разовая Данные уже хранятся в базе, и хранятся в описанном виде: Бла "бла" 'бла' &бла& <a href="адрес ссылки, может содержать & ">ссылка может содержать спецсимволы</a> <любой текст в знаках больше меньше> <img src="адрес картинки может содержать &" alt="" />, а также другие элементы разметки html, с атрибутами, значение которых заключается в двойные/одинарные кавычки
При выводе текста нужно спецсимволы превратить в html сущности
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 16-11-2011 16:39 » |
|
Или же исправить саму базу... Подумать надо. Можно и регулярку на писать. Когда-то аналогично мне пришлось статьи наши конвертировать, перед тем как мы их на форум перенесли.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Avdey
Участник
Offline
|
|
« Ответ #8 : 17-11-2011 01:10 » |
|
Напиши функцию которая делает так=) Разбивает весь твой текст по символу в массив, далее идёт поэтапная проверка массива циклом while далее как встречаеться символ кавычки, апострофы, амперсанды преравнивает (заменяет) на их html сущности, а потом идёт дальше....короче какое хочешь условие и пиши туда. str_replace(); - функция для преобразования строки в массив по символам.(вроде)
|
|
« Последнее редактирование: 17-11-2011 02:20 от Avdey »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 17-11-2011 03:54 » |
|
Как я уже говорил, главным символом является "<", т.к. с него начинаются теги. Написать универсальное выражение действительно проблематично, но можно делать ступенчатые проверки. Поиск открывающего тега: %<\s*([a-z]+)([^<>]*?)\s*>%i Выражение захватывает тег целиком, подвыражения захватывают имя тега и блок, потенциально содержащий атрибуты. Нужно проверить по списку, является ли имя допустимым, а атрибуты похожи на правду. Проверка атрибутов (если строка атрибутов не пустая): %(?:\s+([a-z]+)(|\s*=\s*'[^']*'|\s*=\*"[^"]*"))+\s*%i Поиск закрывающего тега: Думаю, тут нужно не заменять на лету, а составить список смещений на начало и конец обнаруженных тегов, а потом по шагам обработать блоки.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #10 : 17-11-2011 06:17 » |
|
Avdey, прочитай, что ты сказал Идея уже понятна, и ее нужно только реализовать Парится текст и... текстовые ноды преобразовываются, Затем все лепится обратно. Да... парсинг, конечно ведется циклом по одному символу, но существуют библиотеки парсинга.. так что...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 17-11-2011 06:43 » |
|
Слав, а Tidy ты уже попробовал?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #12 : 17-11-2011 06:46 » |
|
нет еще.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 17-11-2011 07:52 » |
|
Попробуй сперва его - глядишь, изобретать ничего не надо будет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #14 : 17-11-2011 16:51 » |
|
еще не добрался до живых данных function safeText ($node){ if (isset($node->id)){ if ($node->isText()) { $node->value = //обрабатываем текст, боюсь что так делать нельзя } } if ($node->hasChildren()) { foreach ($node->child as $child) { safeText($child); } } } //с конфигом чуть позжее $tidy = tidy_parse_string('входящая строка','конфигурация');
в конфиге нашел... numeric-entities, установив в тру вернет уже исправленный текст $config = array('numeric-entities' => true); $repairString = tidy->repairString('входящая строка',$config); Черновик
|
|
« Последнее редактирование: 17-11-2011 18:18 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 17-11-2011 21:07 » |
|
1. Можно.т Только исследуй на счет ссылок. Чай быстрее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|