使用 HTML Purifier 删除 <li> 标签内的所有 <p> 标签

问题描述

正如标题所说,我需要使用 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);