我正在尝试从加载了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">
该怎么做?
答案 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]
会将结果列表限制为找到的第一个节点。