不过还好,我这里讲的都不是纯粹的代码,好歹也有些分析的过程,分享这些东西比贴代码有用多了。
PHP中使用Tidy
要在PHP中使用Tidy需要安装Tidy模块,也就是加载tidy.so这个PHP extension,具体过程就略了,纯粹是体力活。最后能在phpinfo()中看到"Tidy support enabled" 就OK。
在这个模块的支持下,PHP中就可以使用Tidy提供的几乎所有的功能。常用的HTML清理是异常轻松的事情,甚至可以生成文档的解析树,像在客户端操作DOM那样的操作HTML的各个Node。下面将会有具体的代码说明,也可以看看PHP官方的相关手册。
纠错和过滤的PHP+Tidy实现
上面说了这么多背景素材,似乎太罗唆了,具体的解决问题的代码才最最直接。
1. 简单的纠错实现
function HtmlFix($html)
{
if(!function_exists('tidy_repair_string'))
return $html;
//use tidy to repair html code
//repair
$str = tidy_repair_string($html,
array('output-xhtml'=>true),
'utf8');
//parse
$str = tidy_parse_string($str,
array('output-xhtml'=>true),
'utf8');
$s = '';
$nodes = @tidy_get_body($str)->child;
if(!is_array($nodes)){
$returnVal = 0;
return $s;
}
foreach($nodes as $n){
$s .= $n->value;
}
return $s;
}
上面的代码就是对可能不规范的XHTML代码进行清理纠错,输出标准的XHTML代码(输入输出都是UTF-8编码)。实现代码不是最精简的,因为为了配合下面的过滤功能,我写的尽可能细致了一些。
2. 高级实现: 纠错+过滤
功能:
XHTML的纠错,输出标准的XHTML代码。
过滤不安全的代码但是不影响内容展示,只是对style/javascript中不安全代码进行清除。
对超长字符串插入<wbr>标记以实现浏览器兼容的自动换行功能,相关文章可参考网页中超长文字的断行问题。
function HtmlFixSafe($html)
{
if(!function_exists('tidy_repair_string'))
return $html;







