比如href="javascript:"的也被清除.
*/
if(strpos($name,'on') === 0
stripos(trim($value),'javascript:') ===0
){
continue;
}
//保留安全的属性
$s .= ' '.$name.'="'.HtmlEscape($value).'"';
}
}
//递归检查该节点下的子节点
if($node->child){
$s .= '>';
foreach($node->child as $child){
_dumpnode($child,$s);
}
//子节点处理完毕,闭合标签
$s .= '</'.$node->name.'>';
}else{
/*
已经没有子节点了,将标签闭合
(事实上也可以考虑直接删除掉空的节点)
*/
if($node->type == TIDY_NODETYPE_START)
$s .= '></'.$node->name.'>';
else
/*
对非配对标签,比如<hr/> <br/> <img/>等
直接以 />闭合之
*/
$s .= '/>';
}
}
//函数定义end
//通过上面的函数 对 body节点开始过滤。
if($body->child){
foreach($body->child as $child)
_dumpnode($child,$s);
}else
return '';
return $s;
}
上面代码中注释应该比较详细,工作原理就配合代码看吧。
更严格的过滤也很容易扩展,比如实现文中的链接自动识别。
一点补充
如果你看过我之前写的网页中超长文字的断行问题,你可能发现上面代码中处理自动换行的函数有所不同:







