PHP 阻止 strip_tags 删除损坏的标签

Pat*_*rio 2 html php strip-tags

我和这个人有同样的情况。

基本上strip_tags删除标签,包括损坏的标签(文档中使用的术语)。<如果它不是 HTML 标记,是否有另一种方法不涉及删除和后面的任何文本?

我目前正在这样做:

$description = "&lt;p&gt;I am currently &lt;30 years old.&lt;/p&gt;";
$body = strip_tags(html_entity_decode($description, ENT_QUOTES, "UTF-8"), "<strong><em><u>");
echo $body;
Run Code Online (Sandbox Code Playgroud)

但是上面的代码会破坏类似的东西:

<p>I am currently <30 years old.</p>
Run Code Online (Sandbox Code Playgroud)

进入:

I am currently
Run Code Online (Sandbox Code Playgroud)

评估输入

这是一个eval.in,所以你们可以明白我的意思。

tri*_*cot 5

您输入的 HTML 无效。所以这需要修复。您可以取代所有那些未关闭<&lt;第一,然后做你html_entity_decode strip_tags

$description = "<p>I am currently <30 years old.</p>";
$description = preg_replace("/<([^>]*(<|$))/", "&lt;$1", $description);
$body = html_entity_decode(strip_tags($description, "<strong><em><u>"),
                           ENT_NOQUOTES, "UTF-8");
echo $body;
Run Code Online (Sandbox Code Playgroud)

eval.in查看

或者,您可以使用 DOM 解析器,这在某些情况下可以提供更好的结果,但您仍然需要先应用修复:

$description = "<p>I am currently <30 years old.</p>";
$description = preg_replace("/<([^>]*(<|$))/", "&lt;$1", $description);
$doc = new DOMDocument();
$doc->loadHTML($description);
$body = $doc->documentElement->textContent;
echo $body;
Run Code Online (Sandbox Code Playgroud)

eval.in查看