PHP阻止strip_tags删除损坏的标记

时间:2016-06-24 21:02:28

标签: php html strip-tags

我的情况与此this guy相同。

基本上strip_tags会删除包含损坏标记的标记(documentation中使用的术语)。是否有其他方法可以执行此操作,如果它不是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;

但上面的代码会破坏:

<p>I am currently <30 years old.</p>

分为:

I am currently

eval.in

这是一个eval.in所以你们可以看到我的意思。

2 个答案:

答案 0 :(得分:3)

您输入的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;

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;

eval.in

上查看

答案 1 :(得分:0)

通常在使用小于和大于运算符时,您几乎总是会使用数字(特别是在这里,因为您已经说过没有涉及空格)。假设这是您的情况,在通过preg_match运行之前,您可以非常轻松地使用strip_tags正则表达此案例场景:

$description = "<p>I am currently <30 years old.</p>";
$description = preg_replace("/<([0-9]+)/", "&lt;$1", $description);
$body = strip_tags($description, "<strong><em><u>");
echo $body;