<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>idea&#039;s blog &#187; DOM</title>
	<atom:link href="http://www.ideawu.net/blog/tag/dom/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ideawu.net/blog</link>
	<description>网络服务器架构, Linux C/C++服务器端开发, TCP/IP网络协议, PHP Web后端和Web前端开发, 网站架构.</description>
	<lastBuildDate>Thu, 12 Jan 2012 14:55:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP解析HTML和loadHTML乱码</title>
		<link>http://www.ideawu.net/blog/archives/505.html</link>
		<comments>http://www.ideawu.net/blog/archives/505.html#comments</comments>
		<pubDate>Wed, 19 May 2010 05:44:57 +0000</pubDate>
		<dc:creator>ideawu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.ideawu.net/blog/archives/505.html</guid>
		<description><![CDATA[<p>为了对 RSS 输出的博客文章进行重新格式化, 比如去掉过于花哨的样式, 去除 JavaScript 脚本代码, 去除 onclick 等, 所以写了相关的 PHP 代码, 使用 DOM 模块.</p>
<h3>1. 乱码解决</h3>
<p>毫无疑问, 一上来就遇到了乱码问题, 虽然我已经按文档所述, 所有的字符使用 UTF-8 编码:</p>
<pre>
$html = '&lt;p&gt;你好&lt;/p&gt;';
$dom = new DOMDocument();
@$dom-&gt;loadHTML($html);
echo $dom-&gt;documentElement-&gt;nodeValue;
</pre>
<p><span id="more-505"></span>但是, 如果改成:</p>
<pre>
$html = '&lt;p&gt;你好&lt;/p&gt;';
$dom = new DOMDocument();
@$dom-&gt;loadXML($html);
echo $dom-&gt;documentElement-&gt;nodeValue;
</pre>
<p>就没有问题. 后来才发现, 原来 loadHTML 会依赖 HTML 中的声明 meta 标签. 如果没有这样的标签, 就当作 iso-8859-1 字符集, 所以乱码. 要解决, 就给字符串加上这样的一个标签在头部:</p>
<pre>
$meta = '&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;';
@$dom-&gt;loadHTML($meta . $html);
</pre>
<h3>2. 递归</h3>
<p>HTML/XML 是递归结构, 所以一定会递归遍历:</p>
<pre>
function _pretty_html_node($node){
	// 递归终止条件
	// 1. XML_TEXT_NODE
	// 2. XML_ELEMENT_NODE
	// 3. 没有子节点

	foreach($node-&gt;childNodes as $n){
		$child_text .= _pretty_html_node($n);
	}

	// 然后对不同的标签做不同的处理
	switch($tag){
		case 'a':
			$href = $node-&gt;getAttribute('href');
			$text .= "&lt;a href=\"$href\"&gt;$child_text&lt;/a&gt;";
		...
	}

	return $text;
}
</pre>
<h3>3. 转义字符处理</h3>
<p>对于文本节点, 其 nodeValue 要经过 htmlspeciachars() 转义. 因为读取 HTML/XML 时, 会对文本进行反转义, 比如 &amp;gt; 在内存中已经是 &gt;了.</p>
<p>下载源码: <a href='http://www.ideawu.net/blog/wp-content/uploads/2010/05/pretty_html.php_.zip'>pretty_html.php</a></p>


<h3>Related posts:</h3><ol><li><a href='http://www.ideawu.net/blog/archives/313.html' rel='bookmark' title='Permanent Link: C# 版的 SimpleXML'>C# 版的 SimpleXML</a></li>
<li><a href='http://www.ideawu.net/blog/archives/55.html' rel='bookmark' title='Permanent Link: 自架设Apache服务器过程中的网页乱码问题'>自架设Apache服务器过程中的网页乱码问题</a></li>
<li><a href='http://www.ideawu.net/blog/archives/367.html' rel='bookmark' title='Permanent Link: Wordpress分页代码'>Wordpress分页代码</a></li>
<li><a href='http://www.ideawu.net/blog/archives/518.html' rel='bookmark' title='Permanent Link: if-else对优化代码冗余度的反作用'>if-else对优化代码冗余度的反作用</a></li>
<li><a href='http://www.ideawu.net/blog/archives/611.html' rel='bookmark' title='Permanent Link: 强大的纯JS数据图工具-flot'>强大的纯JS数据图工具-flot</a></li>
</ol><div><p><img src="http://www.ideawu.net/favicon.ico" /> 你现在看的文章是: <a href="http://www.ideawu.net/blog/archives/505.html" title="PHP解析HTML和loadHTML乱码">PHP解析HTML和loadHTML乱码</a></p>

<div>
	<a href="http://www.benegg.com/linode-ad.php">
		Linode VPS - 美国虚拟主机
	</a>
	|
	<a href="http://www.udpwork.com/">
		IT牛人博客聚合网站
	</a>
</div></div>]]></description>
			<content:encoded><![CDATA[<p>为了对 RSS 输出的博客文章进行重新格式化, 比如去掉过于花哨的样式, 去除 JavaScript 脚本代码, 去除 onclick 等, 所以写了相关的 PHP 代码, 使用 DOM 模块.</p>
<h3>1. 乱码解决</h3>
<p>毫无疑问, 一上来就遇到了乱码问题, 虽然我已经按文档所述, 所有的字符使用 UTF-8 编码:</p>
<pre>
$html = '&lt;p&gt;你好&lt;/p&gt;';
$dom = new DOMDocument();
@$dom-&gt;loadHTML($html);
echo $dom-&gt;documentElement-&gt;nodeValue;
</pre>
<p><span id="more-505"></span>但是, 如果改成:</p>
<pre>
$html = '&lt;p&gt;你好&lt;/p&gt;';
$dom = new DOMDocument();
@$dom-&gt;loadXML($html);
echo $dom-&gt;documentElement-&gt;nodeValue;
</pre>
<p>就没有问题. 后来才发现, 原来 loadHTML 会依赖 HTML 中的声明 meta 标签. 如果没有这样的标签, 就当作 iso-8859-1 字符集, 所以乱码. 要解决, 就给字符串加上这样的一个标签在头部:</p>
<pre>
$meta = '&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;';
@$dom-&gt;loadHTML($meta . $html);
</pre>
<h3>2. 递归</h3>
<p>HTML/XML 是递归结构, 所以一定会递归遍历:</p>
<pre>
function _pretty_html_node($node){
	// 递归终止条件
	// 1. XML_TEXT_NODE
	// 2. XML_ELEMENT_NODE
	// 3. 没有子节点

	foreach($node-&gt;childNodes as $n){
		$child_text .= _pretty_html_node($n);
	}

	// 然后对不同的标签做不同的处理
	switch($tag){
		case 'a':
			$href = $node-&gt;getAttribute('href');
			$text .= "&lt;a href=\"$href\"&gt;$child_text&lt;/a&gt;";
		...
	}

	return $text;
}
</pre>
<h3>3. 转义字符处理</h3>
<p>对于文本节点, 其 nodeValue 要经过 htmlspeciachars() 转义. 因为读取 HTML/XML 时, 会对文本进行反转义, 比如 &amp;gt; 在内存中已经是 &gt;了.</p>
<p>下载源码: <a href='http://www.ideawu.net/blog/wp-content/uploads/2010/05/pretty_html.php_.zip'>pretty_html.php</a></p>


<h3>Related posts:</h3><ol><li><a href='http://www.ideawu.net/blog/archives/313.html' rel='bookmark' title='Permanent Link: C# 版的 SimpleXML'>C# 版的 SimpleXML</a></li>
<li><a href='http://www.ideawu.net/blog/archives/55.html' rel='bookmark' title='Permanent Link: 自架设Apache服务器过程中的网页乱码问题'>自架设Apache服务器过程中的网页乱码问题</a></li>
<li><a href='http://www.ideawu.net/blog/archives/367.html' rel='bookmark' title='Permanent Link: Wordpress分页代码'>Wordpress分页代码</a></li>
<li><a href='http://www.ideawu.net/blog/archives/518.html' rel='bookmark' title='Permanent Link: if-else对优化代码冗余度的反作用'>if-else对优化代码冗余度的反作用</a></li>
<li><a href='http://www.ideawu.net/blog/archives/611.html' rel='bookmark' title='Permanent Link: 强大的纯JS数据图工具-flot'>强大的纯JS数据图工具-flot</a></li>
</ol><div><p><img src="http://www.ideawu.net/favicon.ico" /> 你现在看的文章是: <a href="http://www.ideawu.net/blog/archives/505.html" title="PHP解析HTML和loadHTML乱码">PHP解析HTML和loadHTML乱码</a></p>

<div>
	<a href="http://www.benegg.com/linode-ad.php">
		Linode VPS - 美国虚拟主机
	</a>
	|
	<a href="http://www.udpwork.com/">
		IT牛人博客聚合网站
	</a>
</div></div>]]></content:encoded>
			<wfw:commentRss>http://www.ideawu.net/blog/archives/505.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

