如果之前或之后没有文字,我如何删除<br/>
?
例如,
<p><br/>hello</p>
<p>hello<br/></p>
他们应该像这样重写,
<p>hello</p>
<p>hello</p>
我应该使用DOMxpath还是正则表达式更好?
(注意:我之前有关于使用DOMxpath删除<p><br/></p>
的{{3}},然后我遇到了这个问题!)
修改
如果我在输入中有这个,
$content = '<p><br/>hello<br/>hello<br/></p>';
那么它应该是
<p>hello<br/>hello</p>'
答案 0 :(得分: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>
不像中间的那样:
<p>hello<br/>hello</p>
PS:最终获得像<br/><br/>
这样的对中的第一个br:
"//br[following::node()[1][self::br]]"
答案 1 :(得分: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());