почему xpath удаляет специальные символы html? - PullRequest
4 голосов
/ 17 января 2012

почему это

<code>$html = '<a href="/browse/product.do?cid=1&amp;vid=1&amp;pid=1" class="productItemName">what is going on here</a>';

$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);

$selectors['link'] = '//a/@href';
$links_nodeList = $xpath->query($selectors['link']);

foreach ($links_nodeList as $link) {
    $links[] = $link->nodeValue;
}

echo("<p>links</p>");
echo("<pre>");
print_r($links);
echo("
");

вывод

links

Array
(
    [0] => /browse/product.do?cid=1&vid=1&pid=1
)

а не

links

Array
(
    [0] => /browse/product.do?cid=1&amp;vid=1&amp;pid=1
)

?

1 Ответ

6 голосов
/ 17 января 2012

Ответ прост :

&amp; - это особый способ представления символа "&" в документе XML.

Эти два обозначают один и тот же символ .

Когда экранированная форма амперсанда выводится в виде текста (не в формате XML), показывается как "&".

Как уточнил @LarsH в своем комментарии :

когда вы говорите loadhtml($html) ;, вы анализируете строку как HTML, это означает, что символьные объекты (например, &amp;) интерпретируются в символы, которые они представляют (например, &). Если вы хотите строку это будет интерпретироваться как &amp;, вам нужно убежать от амперсанда, например &amp;amp;

...