PHP xpath:如何获取开始标记?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (81)

我正在尝试使用加载了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">

怎么办?

提问于
用户回答回答于

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;
}

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

扫码关注云+社区

领取腾讯云代金券