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
Форумы портала PHP.SU :: Версия для печати :: DOMDocument кодирует кириллицу
Форумы портала PHP.SU » » Вопросы новичков » DOMDocument кодирует кириллицу

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

1. Реф - 08 Сентября, 2013 - 02:37:01 - перейти к сообщению
Пример:
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 возвращал то, что нужно?
2. armancho7777777 - 08 Сентября, 2013 - 05:34:16 - перейти к сообщению
Нет.
Он их кодирует за Вас.
Не переживайте, ссылки валидные.
3. Реф - 08 Сентября, 2013 - 15:55:31 - перейти к сообщению
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)
4. armancho7777777 - 08 Сентября, 2013 - 18:07:23 - перейти к сообщению
Ну тогда регулярками правьте.
(Добавление)
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.  
5. Реф - 08 Сентября, 2013 - 19:10:26 - перейти к сообщению
Любые решения, которые будут пытаться "исправить" то, что возвращает 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>
6. armancho7777777 - 09 Сентября, 2013 - 03:01:40 - перейти к сообщению
Реф пишет:
Конкретно Ваше решение возвращает:

возвращает корректные ссылки.
Ну раз так принципиально, то вот:
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.  

 

Powered by ExBB FM 1.0 RC1