PHP 阻止 strip_tags 删除损坏的标签

问题描述 投票:0回答:3

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

基本上

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;

但是上面的代码会破坏如下内容:

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

进入:

I am currently

评估.in

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

php html strip-tags
3个回答
6
投票

您输入的 HTML 无效。所以这需要修复。您可以先将所有未关闭的

<
替换为
&lt;
,然后再执行您的
html_entity_decode
after
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
投票

通常在使用小于和大于运算符时,您几乎总是会使用数字(尤其是在这里,因为您已经说过不涉及空格)。假设这是您的情况,您可以很容易地使用

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;

0
投票

@trincot 所做的 preg 替换有效,但它可能仅适用于第一次出现,如本例所示:

$v = 'a < b < c';
$v = preg_replace("/<([^>]*(<|$))/", "&lt;$1", $v);
echo $v; // a &lt; b < c

所以它可能在这样的循环中:

$v = 'a < b < c';
while (preg_match("/<([^>]*(<|$))/", $v)) $v = preg_replace("/<([^>]*(<|$))/", "&lt;$1", $v);
echo $v; // a &lt; b &lt; c
© www.soinside.com 2019 - 2024. All rights reserved.