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 :: DOMDocument кодирует кириллицу

 PHP.SU

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


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

> Описание: Экранирует русскоязычные домены в атрибуте href ссылок
Реф
Отправлено: 08 Сентября, 2013 - 02:37:01
Post Id



Частый гость


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


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




Пример:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. header('Content-type: text/html; charset=utf-8');
  4.  
  5. $dom = new DOMDocument('1.0', 'utf-8');
  6. $elem = $dom->createElement('a', 'россия.рф');
  7. $elem->setAttribute('href', 'http://россия.рф?param=%D1%80%D1%84');
  8. $html = $dom->saveHTML($elem);
  9.  
  10. echo htmlentities($html, ENT_QUOTES, 'utf-8');


Результат:
CODE (html):
скопировать код в буфер обмена
  1. <a href="http://%D1%80%D0%BE%D1%81%D1%81%D0%B8%D1%8F.%D1%80%D1%84?param=%D1%80%D1%84">россия.рф</a>


А хотелось бы получать:
CODE (html):
скопировать код в буфер обмена
  1. <a href="http://россия.рф?param=%D1%80%D1%84">россия.рф</a>


Можно ли что-то сделать, чтобы saveHTML возвращал то, что нужно?

(Отредактировано автором: 08 Сентября, 2013 - 15:49:27)



-----
Думать надо головой, а не головкой!
 
 Top
armancho7777777 Супермодератор
Отправлено: 08 Сентября, 2013 - 05:34:16
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Нет.
Он их кодирует за Вас.
Не переживайте, ссылки валидные.

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

 
 Top
Реф
Отправлено: 08 Сентября, 2013 - 15:55:31
Post Id



Частый гость


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


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




armancho7777777 пишет:
Не переживайте, ссылки валидные.


Браузеры так не считают:
Цитата:
Firefox не может найти сервер %d1%80%d0%be%d1%81%d1%81%d0%b8%d1%8f.%d1%80%d1%84.


Цитата:
Убедитесь, что веб-адрес http://%d1%80%d0%be%d1%81%d1%81%d0%b8%d1%8f.%d1%80%d1%84 правильный.
(IE)


-----
Думать надо головой, а не головкой!
 
 Top
armancho7777777 Супермодератор
Отправлено: 08 Сентября, 2013 - 18:07:23
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Ну тогда регулярками правьте.
(Добавление)
PHP:
скопировать код в буфер обмена
  1.  
  2. class MYDocument extends DOMDocument {
  3.  
  4.         public function saveHTML($arg = NULL)
  5.         {
  6.                 return preg_replace_callback(
  7.                         '~(?<=href=)([\'|"])(?P<href>[^\1]+)\1~',
  8.                         function($match) {
  9.                                 return '"' . urldecode($match['href']) . '"';
  10.                         },
  11.                         parent::saveHTML($arg)
  12.                 );
  13.         }
  14. }
  15.  
  16.  
  17. $dom = new MYDocument('1.0', 'utf-8');
  18.  
  19. $elem = $dom->createElement('a', 'россия.рф');
  20.  
  21. $elem->setAttribute('href', 'http://россия.рф?param=%D1%80%D1%84');
  22.  
  23. $html = $dom->saveHTML($elem);
  24.  
 
 Top
Реф
Отправлено: 08 Сентября, 2013 - 19:10:26
Post Id



Частый гость


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


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




Любые решения, которые будут пытаться "исправить" то, что возвращает DOMDocument::saveHTML, скорее всего, обречены на провал.

Конкретно Ваше решение возвращает:
CODE (html):
скопировать код в буфер обмена
  1. <a href="http://россия.рф?param=рф">россия.рф</a>

вместо нужного
CODE (html):
скопировать код в буфер обмена
  1. <a href="http://россия.рф?param=%D1%80%D1%84">россия.рф</a>


Конечно, можно предложить реализацию MyDocument::saveHTML, которая вернёт то, что нужно конкретно в этом случае (не декодировать параметры запроса), но легко приведу пример, когда и это решение не сработает.

Если сформулировать ещё точнее, необходимо чтобы в атрибуте href на выходе лежало именно то, что в нём было записано методом setAttribute.

Если было:
PHP:
скопировать код в буфер обмена
  1. $elem->setAttribute('href', 'http://%D1%80оссия.рф?рф=рф%D1%80%D1%84');


То на выходе должно быть:
CODE (html):
скопировать код в буфер обмена
  1. <a href="http://%D1%80оссия.рф?рф=рф%D1%80%D1%84">россия.рф</a>

(Отредактировано автором: 08 Сентября, 2013 - 19:10:45)



-----
Думать надо головой, а не головкой!
 
 Top
armancho7777777 Супермодератор
Отправлено: 09 Сентября, 2013 - 03:01:40
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Реф пишет:
Конкретно Ваше решение возвращает:

возвращает корректные ссылки.
Ну раз так принципиально, то вот:
PHP:
скопировать код в буфер обмена
  1.  
  2. class MYDocument extends DOMDocument {
  3.  
  4.         public function saveHTML($arg = NULL)
  5.         {
  6.                 return preg_replace_callback(
  7.                         '~(?<=href=)([\'|"])(?P<href>[^\1]+)\1~',
  8.                         function($match)
  9.                         {                              
  10.                                 $host = parse_url($match['href'], PHP_URL_HOST);
  11.                                 $path = parse_url($match['href'], PHP_URL_PATH);
  12.                                
  13.                                 $match['href'] = str_replace(
  14.                                         array($host, $path),
  15.                                         array(urldecode($host), urldecode($path)),
  16.                                         $match['href']
  17.                                 );
  18.                                
  19.                                 return '"' . $match['href'] . '"';
  20.                         },
  21.                         parent::saveHTML($arg)
  22.                 );
  23.         }
  24. }
  25.  
  26.  
  27. $dom = new MYDocument('1.0', 'utf-8');
  28. $elem = $dom->createElement('a', 'россия.рф');
  29. $elem->setAttribute('href', 'http://россия.рф?param=%D1%80%D1%84');
  30. $html = $dom->saveHTML($elem);
  31. echo htmlspecialchars($html);
  32.  

(Отредактировано автором: 09 Сентября, 2013 - 06:46:58)

 
 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