PHP HTML DomDocument getElementById问题

Jé *_*eue 8 html php parsing

这里的PHP解析有点新,但我似乎无法让PHP的DomDocument返回明显可识别的节点.加载的HTML将来自'net,因此不一定能保证XML合规性,但我尝试以下方法:

<?php
header("Content-Type: text/plain");

$html = '<html><body>Hello <b id="bid">World</b>.</body></html>';

$dom = new DomDocument;
$dom->preserveWhiteSpace = false;
$dom->validateOnParse = true;

/*** load the html into the object ***/
$dom->loadHTML($html);
var_dump($dom);    

$belement = $dom->getElementById("bid");
var_dump($belement);

?>
Run Code Online (Sandbox Code Playgroud)

虽然我没有收到任何错误,但我只收到以下输出:

object(DOMDocument)#1 (0) {
}
NULL
Run Code Online (Sandbox Code Playgroud)

我是否应该无法查找<b>标签,因为它确实有ID?

Wri*_*ken 19

手册解释了原因:

要使此功能起作用,您需要使用DOMElement-> setIdAttribute()或DTD设置一些ID属性,DTD将属性定义为ID类型.在后一种情况下,您需要在使用此函数之前使用DOMDocument-> validate()或DOMDocument-> validateOnParse验证您的文档.

无论如何,请寻找有效的HTML并提供DTD.

快速修复:

  1. 调用$dom->validate();并忍受错误(或修复它们),之后您可以使用$dom->getElementById(),无论出于某种原因的错误.
  2. 如果你不喜欢validing,请使用XPath: $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
  3. 想一想:如果你加载HTML 之前设置validateOnParse为true ,那么它也会起作用; P

.

$dom = new DOMDocument();
$html ='<html>
<body>Hello <b id="bid">World</b>.</body>
</html>';
$dom->validateOnParse = true; //<!-- this first
$dom->loadHTML($html);        //'cause 'load' == 'parse

$dom->preserveWhiteSpace = false;

$belement = $dom->getElementById("bid");
echo $belement->nodeValue;
Run Code Online (Sandbox Code Playgroud)

在这里输出'世界'.

  • @Xepoch在使用带有HTML的`DOM`时,我从未设法让`getElementById`正常工作.但你可以用`// p [@ id ="foo"]这样的XPath替换`getElementById` (2认同)
  • @Gordon:好的,请注意这不是跨操作系统/版本行为.值得庆幸的是,如果在我的服务器上工作:) XPath保持故障安全回退afaik. (2认同)