php中DOMDocument的几点记录

php中DOMDocument的几点记录
用了大半天时间将  Readability 移植到php中来。其间主要用的是php中的DOMDocument类,这里做一些记录。

1. 如果 html 代码不规范,用 DOMDocument::loadHTML 时会有一些错误提示,不过不影响使用。可以在调 loadHTML 前使用 libxml_use_internal_errors(true); 忽略不重要的错误输出。

2. DOMDocument::loadHTML会判断 html 的 <meta> 字段里的 charset 类型,所以不用在创建 DOMDocument 对象时指定编码,否则可能出错。

3. 如果用 foreach 迭代 DOMNode::getElementsByTagName 返回的集合去删除某些节点时,会有问题(删不掉),如下面的代码是有问题的:

foreach ($node->getElementsByTagName('div') as $n)
$n->parentNode->removeChild($n);

正确的做法是:

function remove(DOMNode &$node, $unuse = null)
{
if ($node->parentNode)
$node->parentNode->removeChild($node);
}
$nodes = array();
foreach ($node->getElementsByTagName($tag) as $n)
array_unshift($nodes, $n);
array_walk($nodes, 'remove');

用 array_unshift 的原因是删的时候应该从 getElementsByTagName 返回的集合后边往前删。避免出现无效节点。

4. 可以用 getElementsByTagName('*') 来获取所有节点

5. 用 DOMDocument::saveXML 导出某个节点为字串时,这个节点必须是属于此 DOMDocument 的。如果传入的是其他 DOMDocument 对象的节点,就会抛出异常。所以要导出某节点 $node ,最好是用: $node->ownerDocument->saveXML($node)

6. DOMNode 及其派生的各类中没有像浏览器DOM结构的 innerHTML 属性可以读取/设置整个DOM结构。我的做法是,要读取某节点的 innerHTML,就将其所有子节点 saveXML(),然后拼接起来;设置某节点的 innerHTML 时,先构造html内容,然后用新的 DOMDocument 对象将html载入,再用新节点替换旧节点。

7. 用 php_sapi_name() 来判断php脚本是从命令行执行的(返回值为cli)还是从web服务器调起的(返回值是cgi)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值