使用PHP获取DOM元素

18

我很难理解如何在PHP中使用DOMElement对象。我找到了这段代码,但我不确定它是否适用于我:

$dom = new DOMDocument();
$dom->loadHTML("index.php");

$div = $dom->getElementsByTagName('div');
foreach ($div->attributes as $attr) {
     $name = $attr->nodeName;
     $value = $attr->nodeValue;
     echo "Attribute '$name' :: '$value'<br />";
}
基本上我需要搜索DOM以查找具有特定ID的元素,然后提取非标准属性(即我使用JS创建并添加的属性),以便我可以查看其值。原因是我需要从`$_GET`获取一个部分和一个基于重定向的HTML中的一个部分。如果有人能够解释一下如何使用DOMDocument来实现这个目的,那将是有帮助的。我真的很难理解正在发生什么以及如何正确地实现它,因为我显然没有做对。
编辑(根据评论的情况):
以下是我参考的代码4-26行:
<div id="column_profile">
    <?php
        require_once($_SERVER["DOCUMENT_ROOT"] . "/peripheral/profile.php");            
        $searchResults = isset($_GET["s"]) ? performSearch($_GET["s"]) : "";

        $dom = new DOMDocument();
        $dom->load("index.php");

        $divs = $dom->getElementsByTagName('div');
        foreach ($divs as $div) {
            foreach ($div->attributes as $attr) {
              $name = $attr->nodeName;
              $value = $attr->nodeValue;
              echo "Attribute '$name' :: '$value'<br />";
            }
        }
        $div = $dom->getElementById('currentLocation');
        $attr = $div->getAttribute('srckey');   
        echo "<h1>{$attr}</a>";
    ?>
</div>

<div id="column_main">

这里是我遇到的错误信息:

Warning: DOMDocument::load() [domdocument.load]: Extra content at the end of the document in ../public_html/index.php, line: 26 in ../public_html/index.php on line 10

Fatal error: Call to a member function getAttribute() on a non-object in ../public_html/index.php on line 21

index.hp不会被执行。loadHTML只是读取文件的内容,而不会运行它。你可能需要做类似这样的事情:$dom->loadHTML(file_get_contents('http://localhost/index.php')) - gen_Eric
2个回答

22
< p > < code >getElementsByTagName< /code > 返回一个元素列表,所以您首先需要循环遍历元素,然后再遍历它们的属性。< /p >
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
    foreach ($div->attributes as $attr) {
      $name = $attr->nodeName;
      $value = $attr->nodeValue;
      echo "Attribute '$name' :: '$value'<br />";
    }
}

根据您的需求,您说您需要一个特定的ID。这些应该是唯一的,所以为了做到这一点,您可以使用(注意 getElementById 可能不起作用,除非您先调用 $dom->validate()):

$div = $dom->getElementById('divID');

然后获取您的属性:

$attr = $div->getAttribute('customAttr');

编辑: $dom->loadHTML 只是读取文件的内容,而不执行它们。以这种方式不会运行index.php。您可能需要执行类似以下操作:

$dom->loadHTML(file_get_contents('http://localhost/index.php'))

1
如果你的HTML没有包含doctype声明,这个代码还能正常工作吗?在DOMDocument::getElementById文档页面上的一条评论指出,如果HTML没有包含doctype声明,getElementById()函数总是返回null - Jay Bienvenu
不确定那个评论想要表达什么。DOMDocument 在没有 <!doctype> 的 HTML 上也能正常工作。演示:https://3v4l.org/0mGrg - gen_Eric
是的,我正在使用DOM库以那种方式来组合HTML。但我试图对组合后的HTML运行测试。即使它在渲染的HTML中明显存在,getElementById()始终返回null - Jay Bienvenu
我已经自己提出了一个问题(https://stackoverflow.com/questions/48156555/php-document-model-finding-an-element-in-a-composed-html-document)。 - Jay Bienvenu

2
你如果是从外部服务器重定向的话,就无法访问HTML。换句话说,在你尝试解析它的那一点上,DOM并不存在。你可以将文本传递给DOM解析器,然后以这种方式操作元素。或者更好的方法是将其作为另一个GET变量添加。
编辑:你是否也知道客户端可以更改HTML并使其通过任何他们想要的东西?(使用像Firebug这样的工具)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接