问题描述
正如标题所说,我需要使用 HTML Purifier 删除 <p>
标签内的所有 <li>
标签。
我的输入是这样的:
<ul>
<li>
<p>111</p>
</li>
<li>
<p>222</p>
</li>
</ul>
<p>333</p>
它应该像这样清洁:
<ul>
<li>111</li>
<li>222</li>
</ul>
<p>333</p>
无论我尝试什么,我都无法让它工作。我可以看到类似的东西在运行 in the example。它确实在那里工作,因为内联标签不允许阻止孩子。但是 <li>
是块并且确实允许 <p>
按规范。但我仍然需要它。请帮忙)
解决方法
我发现了很棒的用于跳过标签的 PHP 函数
<?php
$tags="<ul>
<li>
<p>111</p>
</li>
<li>
<p>222</p>
</li>
</ul>";
echo strip_tags($tags,["li","ul"]);
?>
strip_tags
有两个参数,一个是 html 字符串,另一个是可接受的标签。它将自动删除未在可接受列表中定义的标签。
它生成的输出字符串:
<ul>
<li>
111
</li>
<li>
222
</li>
</ul>
,
您也可以尝试使用 HTML Purifier 净化后使用 PHP 的 DOMDocument - https://www.php.net/manual/en/class.domdocument.php
循环遍历所有段落<p>
元素,如果它们的直接父元素是列表项<li>
,则将li
的{{1}}设置为textContent
的{{ 1}}。
类似的东西:
p
更新:
我的例子有点简化。事实上,我在别处有 textContent
标签,不仅在 $html = '<ul>
<li>
<p>111</p>
</li>
<li>
<p>222</p>
</li>
</ul>
';
$doc = new DOMDocument();
$doc->loadHTML($html,LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // See https://www.php.net/manual/en/domdocument.savehtml.php#119767
$paragraphs = $doc->getElementsByTagName('p');
$paragraphsLength = $paragraphs->length;
for ($i = 0; $i < $paragraphsLength; $i++) {
$p = $paragraphs->item(0); // See https://www.php.net/manual/en/domdocument.getelementsbytagname.php#99716
if ($p->parentNode->tagName === 'li') {
$p->parentNode->textContent = $p->textContent;
}
}
echo $doc->saveHTML();
如果您的 HTML 更大。天真地遍历所有段落可能不是最高效的方式,您应该查看 DOMXPath。 例如:
<p>
,
你可以使用“strip_tags()”
https://www.w3schools.com/php/func_string_strip_tags.asp
但它会删除所有标签,但您可以保留允许的标签
或str_replace
:
$result = str_replace(array("<p>","</p>"),array('',''),$str);