2009-10-04 43 views
0
$dom = new DOMDocument(); 
$dom->loadHTML($string); 
$dom->preserveWhiteSpace = false; 
$elements = $dom->getElementsByTagName('span'); 
$spans = array(); 
foreach($elements as $span) { 
    $spans[] = $span; 
} 
foreach($spans as $span) { 
    $span->parentNode->removeChild($span); 
} 
return $dom->saveHTML();  
//return $string; 

当我使用此代码来解析字符串时,它将更改编码和符号在return $string未注释时不会显示相同。为什么会这样,以及如何避免字符集变化为什么PHP DOM解析会影响字符集?

+0

什么是你的HTML文档的编码和你有什么用返回值吗? – Gumbo 2009-10-04 14:46:43

回答

1

遗憾的是,似乎DOMDocument会自动将所有字符转换为HTML实体,除非它知道原始文档的编码。

显然,一种选择是将内容类型/编码的<meta>标记添加到原始字符串,但这意味着它也会出现在输出中。删除它可能不是那么容易。

另一种选择,我能想到的是手动解码HTML实体,使用这样的代码:

$trans = array_flip(get_html_translation_table(HTML_ENTITIES)); 
unset($trans["&quot;"], $trans["&lt;"], $trans["&gt;"], $trans["&amp;"]); 
echo strtr($dom->saveHTML(), $trans); 

这是一个严重的丑陋的解决方案,但我不能想其他任何东西,比其他一个不同的HTML解析器。 :(

+0

当然,我必须将数据以utf-8编码存储到数据库。这是DOMDocument工作的唯一情况。 顺便说一句,我不太确定如何使用你的这个解决方案。实际上$ trans变量包含什么? 谢谢, Ile – 2009-10-04 19:41:23

0

还有我今天注意到一个有趣的事情......我没有意识到它为什么会发生,但它是非常奇怪的行为......从上面的代码设置的功能。当字符串被传递给函数和它的功能过程中返回的字符串在一些无法解释的情况下,加入<doctype...> <html><body>STRING</body></html>后: 数据从数据库加载,当从数据库中该数据直接进行运作它不添加此额外的标签,但是当数据首先被存储到变量,比这函数被调用下面的地方添加这些额外的价值。 也一个奇怪的事情...... 我有一个案子的时候我叫这个额外的函数来处理字符串和几行字下面我添加微调功能从DOM函数返回我的错误.. 。当我删除这个修剪功能(被称为在dom函数之后)错误消失......任何合理的解释?