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



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

<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 />标记在列表项之间添加行。

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

您不应该使用regex来解析HTML,因为它不知道标记和看起来像标记的文本之间的区别。

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

XPath查询表示:";目标所有br标记都是ul的直接子级,ul标记可以在文档的任何深度中找到。

代码:(Demo((甚至允许<li>中的<br>(

$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>

使用preg_replace_callback()替换<ul></ul>之间的所有内容,使用一个删除<br />的回调函数

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

最新更新