【发布时间】:2013-03-11 06:14:24
【问题描述】:
我想找到所有根级#text 节点(或具有 div 父级的节点),这些节点应包含在 <p> 标记内。在下面的文本中应该有三个(甚至只有两个)最终根<p> 标签。
<div>
This text should be wrapped in a p tag.
</div>
This also should be wrapped.
<b>And</b> this.
这个想法是更好地格式化文本,以便将文本块分组为 HTML 显示的段落。但是,我一直在研究的以下 xpath 似乎无法选择文本节点。
<?php
$html = '<div>
This text should be wrapped in a p tag.
</div>
This also should be wrapped.
<b>And</b> this.';
libxml_use_internal_errors(TRUE);
$dom = DOMDocument::loadHTML($html);
$xp = new DOMXPath($dom);
$xpath = '//text()[not(parent::p) and normalize-space()]';
foreach($xp->query($xpath) as $node) {
$element = $dom->createElement('p');
$node->parentNode->replaceChild($element, $node);
$element->appendChild($node);
}
print $dom->saveHTML();
【问题讨论】:
-
如果您还想选择
divs 之外的文本节点,为什么还要将//div放在XPath 表达式中? This fiddle 似乎在做你想做的事。 -
你能告诉我我上面发布的解决方案有什么问题吗?是否要将带有换行符的文本转换为多个段落?
-
@nwellnhof,你的解决方案很好——但这不是答案,所以我不能奖励你任何东西。
-
@nwellnhof,太棒了!谢谢!