2012-01-17 23 views
4

なぜこのxpathがhtmlの特殊文字を削除するのはなぜですか?

$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("</pre>"); 

出力

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 
) 

答えて

6

答えは簡単です:

&amp;は、XML文書内の文字"&"を表現する特別な方法です。

これら2つは同じ文字を示します。

エスケープ形式のアンパサンドをテキストとして出力すると(XMLではありません)、"&"として表示されます。

として、さらに彼のコメントに@LarsHにより詳しく説明:あなたはloadhtml($html)を言うとき

;、あなたは(&amp;のような)文字エンティティはに に解釈されることを意味HTML、 として文字列を解析していますそれらが表す文字(&など)。文字列 が&amp;と解釈されるようにするには、アンパサンドをエスケープする必要があります。 &amp;amp;

+0

+1良い答え。具体的には、 'loadhtml($ html);'と言うと、その文字列をHTMLとして解析しています。つまり、 '& 'のような文字エンティティは、(&のように)それらの文字に解釈されます。 '&'と解釈される文字列が必要な場合は、アンパサンドをエスケープする必要があります。 '& amp;' – LarsH

+0

@LarsH:良い説明です。 –

関連する問題