首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP xpath如何获取开始标记

PHP xpath如何获取开始标记
EN

Stack Overflow用户
提问于 2018-08-16 16:03:19
回答 1查看 89关注 0票数 0

我正在尝试从一个加载了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">

该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2018-08-18 06:41:54

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表达式中会将结果列表限制为找到的第一个节点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51872341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档