删除 <br /> 标记,这些标记是 <ul> 标记的不需要/无效的子项

Remove <br /> tags which are unwanted/invalid children of a <ul> tag

提问人:PTTW 提问时间:8/27/2022 最后编辑:mickmackusaPTTW 更新时间:8/28/2022 访问量:102

问:

如何从标签之间删除这些标签?<br /><ul>

<p>Paragraph 1 <br /> Break line</p>
     <ul> <br />
    <li>  New Line</li>   <br />
    <li> Second line </li>   <br />
    <li> Third line </li>   <br />
    </ul>  
<p>Paragraph two. <br /> break line</p>

列表项之间的标记是在列表项之间添加行。<br />

如何仅在两者之间删除这些标签?我不想删除任何其他标签。<br /><ul> </ul><br/>

php dom html 解析 str-replace removechild

评论


答:

1赞 Barmar 8/27/2022 #1

用于替换 和 之间的所有内容,使用删除preg_replace_callback()<ul></ul><br />

$text = preg_replace_callback('#<ul>.*?</ul>#s', function($matches) {
    return str_replace('<br />', '', $matches[0]);
}, $text);

评论

0赞 mickmackusa 8/27/2022
作为边缘情况考虑,此方法将错误地删除作为标记的子级的标记。<br /><li>
0赞 PTTW 8/27/2022
谢谢,但它又回来了PHP Warning: preg_replace_callback(): Unknown modifier 'l'
0赞 Barmar 8/28/2022
我忘了转义嵌入或使用不同的分隔符。/
2赞 mickmackusa 8/27/2022 #2

不应使用正则表达式来解析 HTML,因为它不知道标记和看起来像标记的文本之间的区别。

它可能看起来像更多的代码,但它是更可靠、更易于阅读和更易于维护的代码。

XPath 查询说:“目标是作为 ul 的直接子级的所有 br 标记,并且可以在文档的任何深度找到 ul 标记。

代码:(演示)(甚至允许<br><li>)

$html = <<<HTML
<div>
<p>Paragraph 1 <br /> Break line</p>
     <ul> <br />
    <li>  New Line</li>   <br />
    <li> Second line </li>   <br />
    <li> Third line </li>   <br />
    </ul>  
<p>Paragraph two. <br /> break line</p>
</div>
HTML;

libxml_use_internal_errors(true);
$dom = new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//ul/br') as $br) {
    $br->parentNode->removeChild($br);
}
echo $dom->saveHTML();

输出:

<div>
<p>Paragraph 1 <br> Break line</p>
     <ul> 
    <li>  New Line</li>   
    <li> Second line </li>   
    <li> Third line </li>   
    </ul>  
<p>Paragraph two. <br> break line</p>
</div>

评论

0赞 PTTW 8/27/2022
它工作得很好,但文本返回的是不可读的文本而不是存储的文本,并且文本不是英语,而是本地语言。它显示良好,但在我尝试使用您的代码后,文本返回为一些不可读的文本。
0赞 mickmackusa 8/28/2022
重要的是,您的问题中的最小可重复示例是现实的。这样可以防止志愿者浪费时间修复原始问题中未公开的内容。请编辑您的问题以提供更好的示例 HTML 文档。
0赞 PTTW 8/28/2022
我已经得到了很好的答案,这是一个真正的问题,但是针对其特定方面发布了它,现在我得到了@Barmar的答案,就是这样谢谢。
0赞 mickmackusa 8/28/2022
好吧,我已经说明了为什么你不应该使用正则表达式。如果你改进你的问题,我会改进我的答案。将本地语言内容添加到示例文本中并不难。告诉我我的专业答案不起作用,然后在它为你坏了时扣留案件是不公平的。
0赞 PTTW 8/29/2022
我没有说你的答案不起作用,事实上,我看到我对你的代码的回答中的第一个词,它说“它运行良好”,你的答案在专业上很棒,但我注意到的一件事是我的本地语言只被改变了。再次感谢您的精彩回答。