DOMDocument and HTML entities
I'm trying to parse some HTML that includes some HTML entities, like ×
$str = '<a href="http://example.com/"> A × B</a>';
$dom = new DomDocument;
$dom -> substituteEntities = false;
$dom ->loadHTML($str);
$link = $dom ->getElements开发者_C百科ByTagName('a') -> item(0);
$fullname = $link -> nodeValue;
$href = $link -> getAttribute('href');
echo "
fullname: $fullname \n
href: $href\n";
but DomDocument substitutes the text for for A × B.
Is there some way to keep it from taking the & for an HTML entity and make it just leave it alone? I tried to set substituteEntities to false but it doesn't do anything
From the docs:
The DOM extension uses UTF-8 encoding.
Use utf8_encode() and utf8_decode() to work with texts in ISO-8859-1 encoding or Iconv for other encodings.
Assuming you're using latin-1 try:
<?php
header('Content-type:text/html;charset=iso-8859-1');
$str = utf8_encode('<a href="http://example.com/"> A × B</a>');
$dom = new DOMDocument;
$dom -> substituteEntities = false;
$dom ->loadHTML($str);
$link = $dom ->getElementsByTagName('a') -> item(0);
$fullname = utf8_decode($link -> nodeValue);
$href = $link -> getAttribute('href');
echo "
fullname: $fullname \n
href: $href\n"; ?>
This is no direct answer to the question, but you may use UTF-8 instead, which allows you to save glyphs like ÷ or × directly. To use UTF-8 with PHP DOM on the other needs a little hack.
Also, if you are trying to display mathematical formulas (as A × B suggests) have a look at MathML.
Are you sure the & is being substituted to &
? If that were the case, you'd see the exact entity, as text, not the garbled response you're getting.
My guess is that it is converted to the actual character, and you're viewing the page with a latin1 charset, which does not contain this character, hence the garbled response.
If I render your example, my output is:
fullname: A × B
href: http://example.com/
When viewing this in latin1/iso-8859-1, I see the output you're describing. But when I set the charset to UTF-8, the output is fine.
I fixed my problem with broken entities by converting UTF-8 to UTF-8 with BOM.
精彩评论