如何删除
如果之前或之后没有文字? DOMxpath 还是正则表达式?

发布于 2024-11-26 17:26:10 字数 692 浏览 1 评论 0原文

如果
前后没有文本,如何删除它?

例如,

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

它们应该像这样重写,

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

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

(注意:我有一篇关于删除 帖子 p>

之前使用 DOMxpath,然后我遇到了这个问题!)

编辑:

如果我在输入中有这个,

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

那么应该是

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

How can I remove <br/> if no text comes before or after it?

For instance,

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

they should be rewritten like this,

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

Should I use DOMxpath or regex would be better?

(Note: I have a post about removing <p><br/></p> with DOMxpath earlier, and then I came across this issue!)

EDIT:

If I have this in the input,

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

then it should be

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鹤舞 2024-12-03 17:26:10

要选择提到的 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,如 in:

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

而不是中间 br,如:

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

PS:最终获得一对中的第一个 br,如下所示
< /代码>:

"//br[following::node()[1][self::br]]"

To select the mentioned br you can use:

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

or, (maybe) faster:

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

Just getting the br when the first (or last) node of p is br.

This will select br such as:

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

and first and last br like in:

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

not middle br like in:

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

PS: to get eventually the first br in a pair like this <br/><br/>:

"//br[following::node()[1][self::br]]"
孤独难免 2024-12-03 17:26:10

对于某些代码,我可以让它像这样工作(演示)。它对 @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());

In case for some code, I could get it to working like this (Demo). It has a slight modification from @empo's xpath (very slightly) and shows the removal of the matches as well as some more test-cases:

$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());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文