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


Автор: crang 13.7.2009, 14:58
Доброго времени суток!
Есть скрипт, который анализирут структуру XML и вставляет дополнительный узел:
Код

    ...
    $tmpMap = "<img src = " . $map . " width= 180  height=180  />";
    $mapIco = htmlspecialchars_decode($tmpMap); 
    $xmlMap = $dom->createElement('mapico', $mapIco);
    $xmlServer->appendChild($xmlMap);
    ... 


результат выглядит так:

Код

<TD STYLE="font-size:14pt font-family:serif">&lt;img src = pics/de_nuke.jpg width= 180  height=180  /&gt;</TD>
 т.е. на странице вместо изображения виден его HTML код

Вопрос - как нормально передавать из PHP спец символы? Или конкретно - как передать строку 
Код

<img src = somemap.jpg width= 180  height=180  />
?

Автор: skyboy 13.7.2009, 15:16
Цитата(crang @  13.7.2009,  13:58 Найти цитируемый пост)
Или конкретно - как передать строку 

дело в том, что у тебя уже строка.
чтоб корректно запихнуть строку
Цитата

<img src = somemap.jpg width= 180  height=180  />

в создаваемый элемент <mapico>, в строке переводятся в сущности все спецсимволы. и происходит это в 
Цитата(crang @  13.7.2009,  13:58 Найти цитируемый пост)
$dom->createElement('mapico', $mapIco);
 потому htmlspecialchars_decode, отрабатывающий шагом ранее, никакого влияния не оказывает.

Добавлено через 4 минуты и 8 секунд
я думаю(предположение гипотетическое: с Dom из-под PHP не работал) должно сработать подобное:
Код

$str = "<img src='somemap.jpg' width='180'  height='180'  />";
$dom= new DOMDocument();
$dom->loadHTML($str); 
$tmpMap = $dom->documentElement;
$xmlMap = $dom->createElement('mapico');
$xmlMap->appendChild($tmpMap);
$xmlServer->appendChild($xmlMap);

Автор: crang 13.7.2009, 15:48
к сожалению ошибка:
Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error' in /usr/home/crang/public_html/st/index.php:26 Stack trace: #0 /usr/home/crang/public_html/st/index.php(26): DOMNode->appendChild(Object(DOMElement)) #1 {main} thrown in /usr/home/crang/public_html/st/index.php on line 26

вот что я оставил:

Код

    $str = "<img src = " . $map . " width= '180'  height='180'  />";
    $dom->loadHTML($str); 
    $tmpMap = $dom->documentElement;
    $xmlMap = $dom->createElement('mapico');
    $xmlMap->appendChild($tmpMap);
    $xmlServer->appendChild($xmlMap);


экземпляр $dom создан ранее, поэтому твою строку 2 опустил..
и попутно 2 вопроса:
1. не затирает ли метод loadHTML уже созданную структуру $dom?
2. не совсем понятен смысл строки tmpMap = $dom->documentElement , т.е. как потом при вызове метода appendChild($tmpMap) ПХП поймет какое значение добавлять?

Автор: solenko 13.7.2009, 15:56
crang, используйте http://ua2.php.net/manual/en/domdocument.createcdatasection.php

Автор: skyboy 13.7.2009, 19:10
кстати, да.
я пытался придумать, как верстку из строки вставить в структуру XML. Если же тебе надо просто для "транспорта" строку запихнуть в структуру, а потом оттуда изъять - используй CDATA.
Цитата(crang @  13.7.2009,  14:48 Найти цитируемый пост)
не затирает ли метод loadHTML уже созданную структуру $dom?

да, заменяет. созданной из отпарсенной строки, переданной аргументом.
Цитата(crang @  13.7.2009,  14:48 Найти цитируемый пост)
не совсем понятен смысл строки tmpMap = $dom->documentElement

в $dom - переменная класса DOMDocument. Чтоб вставить через appendChild в другой элемент, надо иметь объект класса DOMNode. $dom->documentElement возвращает как раз первый элемент класса DOMNode(которая наследует класс DOMElement).
Но это был чисто теоретический изыск. Скорее всего, опираясь только на документацию, я что-то не так понял и допустил ошибку.

Автор: crang 14.7.2009, 11:04
спасибо всем, решилось обходом использования тегов в пхп коде, добавил в XSL шаблон:
Код

<TD STYLE="font-size:14pt font-family:serif">
      <xsl:apply-templates select="mapico" />
      <img src="{mapico/@img}" width="180"/>
</TD>


а в пхп скрипте передал атрибуты:

Код

    $map = "pics/" . $picdir . $data->getElementsByTagName("map")->item(0)->nodeValue . ".jpg";  
    $xmlMap = $dom->createElement('mapico');
    $mapnode = $xmlServer->AppendChild($xmlMap);
    $mapnode->setAttribute('img',$map);  


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