我的情况与此this guy相同。
基本上strip_tags
会删除包含损坏标记的标记(documentation中使用的术语)。是否有其他方法可以执行此操作,如果它不是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所以你们可以看到我的意思。
答案 0 :(得分:3)
您输入的HTML无效。所以这需要修复。您可以先在<
之前替换所有未结算的<
,然后在 html_entity_decode
后执行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;
上查看
或者你可以使用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;
上查看
答案 1 :(得分:0)
通常在使用小于和大于运算符时,您几乎总是会使用数字(特别是在这里,因为您已经说过没有涉及空格)。假设这是您的情况,在通过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;