Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > DOMDocument вместо русских букв ссылки


Автор: yalo 26.8.2012, 14:59
Здравствуйте, уважаемые жители форума Винград:)
 У меня такой вопрос. Почему при использовании объекта DOMDocument русский текст при просмотре html-кода в браузере заменен на ссылки? Поясню.
Вот упрощенный для наглядности xml:
Код

<?xml version="1.0"  encoding="UTF-8"?>
<text>просто русский текст</text>

а вот код пхп, пользующий этот xml (тоже упрощен):
Код

<?php
$xml = new DOMDocument ('1.0', 'UTF-8');
$xml->load ('test.xml');
echo $xml->saveHTML ();
echo $html;

При запуске пхп-скрипта в браузере все будет выглядеть красиво, а именно получим обычный черный текст "просто русский текст" в белом окне браузера. Но если посмотрим сгенерённый для браузера html-код, то там мы увидим такое вот чудо "<text>просто русский текст</text>" Подскажите, пожалуйста, в чем может быть причина. Все тексты в UTF-8 сохранены.
Сначала задавала свой вопрос в другой ветке форума http://forum.vingrad.ru/forum/topic-226949/kw-xsl-%D0%BA%D0%BE%D0%B4%D1%8B-%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2.html - там я в дополнение к существующему похожему вопросу уже присоединилась и описала свой детально, но мне посоветовали сюда обратиться, поскольку до преобразования xslt, как я выяснила, у меня дело в общем-то и не доходило даже..
Заранее спасибо:)


Автор: Fortop 26.8.2012, 17:15
Цитата(yalo @  26.8.2012,  14:59 Найти цитируемый пост)
 чудо "<text>просто русский текст</text>"

А что в этом чудного? smile

По факту, если вам мешают entities, то делаем так


Код

echo html_entity_decode($xml->saveHTML (), ENT_COMPAT , 'UTF-8');

Автор: yalo 27.8.2012, 15:22
только сейчас обратила внимание, что там у меня почему-то не ссылки на русские буквы, а все же русские буквы.. странно, вроде ссылки вставляла типа 

& # 1055; & # 1088;& # 1080;& # 1074;& # 1077;& # 1090; & # 1052;& # 1080;& # 1088; (пробелы надо убрать, просто если я их уберу, то движок форума их преобразует в буквы, вот оно че, михалыч, оказывается..), а появился сам текст..

Fortop, а как-то без постоянного применения html_entity_decode можно все же обойтись? Это ж наверное на скорости скажется. Может лучше разобраться почему такое происходит, и саму причину устранить, а не последствие?

Автор: Fortop 27.8.2012, 22:47
Цитата(yalo @  27.8.2012,  15:22 Найти цитируемый пост)
Fortop, а как-то без постоянного применения html_entity_decode можно все же обойтись? 

Без понятия, глубоко не копал и не встречался.
Посмотрите, посмотрите исходники и документацию по libxml

Но чем вам это мешает? Если не мешает - то оставьте как есть.

Добавлено через 1 минуту и 10 секунд
Цитата(yalo @  27.8.2012,  15:22 Найти цитируемый пост)
Это ж наверное на скорости скажется

У вас, как я понял из другой ветки, xslt идет, так что сильно хуже не будет

Автор: yalo 29.8.2012, 12:33
Fortop, 
Цитата(Fortop @  27.8.2012,  22:47 Найти цитируемый пост)
У вас, как я понял из другой ветки, xslt идет, так что сильно хуже не будет 

В смысле?smile тормознее xslt уже ничего не будет?smile

Автор: Fortop 29.8.2012, 19:14
Цитата(yalo @  29.8.2012,  12:33 Найти цитируемый пост)
В смысле? тормознее xslt уже ничего не будет? 

Тормознее сделать всегда можно.
Но он не быстрый.

Поэтому одна функция вас не убьет.

Автор: krypt3r 30.8.2012, 06:42
Код

$tr = $proc->transformToDoc ($xml);
echo $tr->saveHTML ($tr->documentElement);

Сущностей, которые ТС называет ссылками, при таком использовании вроде не должно быть.

Автор: yalo 23.9.2012, 10:23
вот код:
Код

    $xml = new DOMDocument('1.0', 'utf-8');
    $xml->formatOutput = true;
    $elem = $xml->createElement('text', 'Русские буквы');
    $xml->appendChild($elem);
    echo $xml->saveHTML ();


Запустите его, пожалуйста, у себя, и посмотрите не только отображение в браузере, а сам исходный код через "просмотреть исходный код" или что-то подобное (в зависимости от браузера). 
У меня в исходнике идут цифры вместо русских букв (ссылки, сущности - не важно уже как их верно назвать в данном случае, мне они просто не нужны здесь).
А по поводу 
Цитата(krypt3r @  30.8.2012,  06:42 Найти цитируемый пост)

$tr = $proc->transformToDoc ($xml);
echo $tr->saveHTML ($tr->documentElement);


мне не нужно, чтобы исправлялся созданный с помощью php xml только при прогонке через  xslt-процессор (да и не исправляется в общем-то им такое, проверяла, но не в этом суть), я хочу чтобы xml созданный выглядел адекватно при просмотре его внутренности, мало ли куда он мне понадобится, может что-то я и не буду скармливать xslt-процессору..

Кстати, может быть у кого-то адекватно отобразится мой код в исходнике? Потестируйте, пожалуйста, на своих веб-серверах, может это настройка денвера какая-то неудачная..

Автор: krypt3r 24.9.2012, 06:21
Цитата
я хочу чтобы xml созданный выглядел адекватно

Эмм, речь о saveHTML(), не? XML тут каким боком?
Цитата
Кстати, может быть у кого-то адекватно отобразится мой код в исходнике?

Ни у кого. Подобное поведение везде проявляется - это особенность libxml2

Автор: petas 26.8.2013, 17:05
Столкнулся с похожей фигней
при использовании стороннего модуля по вытягиваю инфы из экселя получил строчку вида 
Код

& #1055 & #1088 & #1086 & #32 & #72 & #101 & #119

долго искал и понял что
1 нехватает ";" перед & чтобы получилось
Код

& #1055;& #1088;& #1086;& #32;& #72;& #101;& #119;

далее немного секаса и интернетом и находим функцию

Код

function decode_entities($text) {
    $text= html_entity_decode($text,ENT_QUOTES,"cp1251"); #NOTE: UTF-8 does not work!
    $text= preg_replace('/&#(\d+);/me',"chr(\\1)",$text); #decimal notation
    $text= preg_replace('/&#x([a-f0-9]+);/mei',"chr(0x\\1)",$text);  #hex notation
    return $text;
}



отличие только в том что у автора вместо "cp1251" была какая-то другая кодировка

на выходе получаем нормальный windows-1251 текстик с английскими буквами и спецсимволами

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)