我和这个这个人有同样的情况。
基本上
strip_tags
会删除标签,包括损坏的标签(文档中使用的术语)。有没有另一种方法可以做到这一点,如果它不是 HTML 标签,则不涉及删除 <
及其后面的任何文本?
我目前正在做这个:
$description = "<p>I am currently <30 years old.</p>";
$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,这样你们就可以明白我的意思。
您输入的 HTML 无效。所以这需要修复。您可以先将所有未关闭的
<
替换为 <
,然后再执行您的 html_entity_decode
after strip_tags
:
$description = "<p>I am currently <30 years old.</p>";
$description = preg_replace("/<([^>]*(<|$))/", "<$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("/<([^>]*(<|$))/", "<$1", $description);
$doc = new DOMDocument();
$doc->loadHTML($description);
$body = $doc->documentElement->textContent;
echo $body;
请参阅 eval.in
通常在使用小于和大于运算符时,您几乎总是会使用数字(尤其是在这里,因为您已经说过不涉及空格)。假设这是您的情况,您可以很容易地使用
preg_match
来正则表达式这种情况场景,然后再运行 strip_tags
:
$description = "<p>I am currently <30 years old.</p>";
$description = preg_replace("/<([0-9]+)/", "<$1", $description);
$body = strip_tags($description, "<strong><em><u>");
echo $body;
@trincot 所做的 preg 替换有效,但它可能仅适用于第一次出现,如本例所示:
$v = 'a < b < c';
$v = preg_replace("/<([^>]*(<|$))/", "<$1", $v);
echo $v; // a < b < c
所以它可能在这样的循环中:
$v = 'a < b < c';
while (preg_match("/<([^>]*(<|$))/", $v)) $v = preg_replace("/<([^>]*(<|$))/", "<$1", $v);
echo $v; // a < b < c