PHP xpath如何获取开始标签

时间:2018-08-16 08:03:19

标签: php html forms xpath domdocument

我正在尝试从加载了HTML字符串的DomDocument中获取具有属性的表单开始标签。

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXpath($dom);
$result = $xpath->query('//form[@class="af-form acf-form"]');

if ($result->length > 0) {
    echo '<pre>';
    print_r(($result->item(0)->C14N()));
    echo '</pre>';
    die();
}

但是这样可以打印出整个表格。我只想获取这一点:

<form action="http://localhost/wp-test/form-loose" class="af-form acf-form" id="form_5b72d1cd12cc0" method="POST">

该怎么做?

1 个答案:

答案 0 :(得分:1)

Xpath获取节点,而不是打开/关闭标签。 DOM是对象的层次结构-只有序列化(HTML)字符串才具有开始/结束标签。

但是,这里有两种可能的方法:

克隆不包含其子节点的节点。保存克隆并使用字符串函数删除结束标记。

$html = <<<'HTML'
<form 
  action="http://localhost/wp-test/form-loose" 
  class="af-form acf-form" id="form_5b72d1cd12cc0" method="POST">
some other stuff
<input>
</form>
HTML;

$document = new DOMDocument();
@$document->loadHTML($html);
$xpath = new DOMXpath($document);

$result = $xpath->evaluate('//form[@class="af-form acf-form"][1]');
foreach ($result as $node) {
  echo substr($document->saveHTML($node->cloneNode()), 0, -7);
}

输出:

<form action="http://localhost/wp-test/form-loose" class="af-form acf-form" id="form_5b72d1cd12cc0" method="POST">

或者您保存每个属性:

$result = $xpath->evaluate('//form[@class="af-form acf-form"][1]');
foreach ($result as $node) {
    $result = '<'.$node->nodeName;
    foreach ($node->attributes as $attribute) {
        $result .= $document->saveHTML($attribute);
    }
    $result .= '>';
    echo $result;
}

注意:在Xpath表达式中添加[1]会将结果列表限制为找到的第一个节点。