如何从<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);