| 
			| 
					
						| 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 | 
								|  | « Ответ #3 : 16-11-2011 12:21 »  |  | 
 
 Ну, если в тексте не в встречается "<", то он с большой вероятностью восстановим.Слав, попробуй tidy. Вроде он до HTML восстанавливает, а уж атрибуты потом можно регулярками поправить до XHTML.
 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #4 : 16-11-2011 13:09 »  |  | 
 
 текста не очень много, до 1к символовможно распарсить html парсером, все текстовые ноды привести кправильному виду, и завернуть все обратно
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #11 : 17-11-2011 06:43 »  |  | 
 
 Слав, а Tidy ты уже попробовал? |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #12 : 17-11-2011 06:46 »  |  | 
 
 нет еще. |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #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 | 
								|  | « Ответ #15 : 17-11-2011 21:07 »  |  | 
 
 1. Можно.т Только исследуй на счет ссылок. Чай быстрее.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	|  |