5

<br/>如果之前或之后没有文字,我该如何删除?

例如,

<p><br/>hello</p>
<p>hello<br/></p>

他们应该像这样重写,

<p>hello</p>
<p>hello</p>

我应该使用 DOMxpath 还是正则表达式会更好?

(注意:我之前有一篇关于使用<p><br/></p>DOMxpath 删除的帖子,然后我遇到了这个问题!)

编辑:

如果我在输入中有这个,

$content = '<p><br/>hello<br/>hello<br/></p>';

那么应该是

<p>hello<br/>hello</p>'
4

2 回答 2

4

要选择提到的 br,您可以使用:

 "//p[node()[1][self::br]]/br[1] | //p[node()[last()][self::br]]/br[last()]"

或者,(也许)更快:

 "//p[br]/node()[self::br and (position()=1 or position()=last())]"

当 p 的第一个(或最后一个)节点是 br 时才得到 br。

这将选择 br,例如:

<p><br/>hello</p>
<p>hello<br/></p>

以及第一个和最后一个 br,例如:

<p><br/>hello<br/>hello<br/></p>

不是中间 br 像:

<p>hello<br/>hello</p>

PS:最终获得像这样的一对中的第一个 br <br/><br/>

"//br[following::node()[1][self::br]]"
于 2011-07-27T13:14:48.820 回答
0

如果有一些代码,我可以让它像这样工作(Demo)。它对@empo 的 xpath 进行了轻微修改(非常轻微),并显示了匹配项的删除以及更多测试用例:

$html = <<<EOD
<p><br/>hello</p>
<p>hello<br/></p>
<p>hello<br/>Chello</p>
<p>hello <i>molly</i><br/></p>
<p>okidoki</p>
EOD;

$doc = new DomDocument;
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$nodes = $xpath->query('//p[node()[1][self::br] or node()[last()][self::br]]/br');
foreach($nodes as $node) {
    $node->parentNode->removeChild($node);
}
var_dump($doc->saveHTML());
于 2011-07-27T13:25:01.243 回答