strip_tags php 删除太多

strip_tags php removes too much

包含 html(请参阅开头的 '' 和 <'blabla)和 PHP 中的函数 strip_tags() 的格式错误的字符串有点麻烦。

我有这个代码:

$str = "To: ''blablal@johndoe.com' <'blablal@johndoe.com>\nSubject: Hello World\nDear Ladies <b>and</b> Gentlemen,";
echo strip_tags($str);

输出如下:

To: ''blablal@johndoe.com' 

我的 wanted/expected 结果是:

To: ''blablal@johndoe.com' 
Subject: Hello World
Dear Ladies and Gentlemen,

你有什么想法吗?

如果 stip_tags() 没有像您预期的那样工作,请尝试这个。

$str = "To: ''blablal@johndoe.com' <'blablal@johndoe.com>\nSubject: Hello World\nDear Ladies <b>and</b> Gentlemen,";

$val = preg_replace('/<[^>]+?>/', ' ', $str);

您的 $val 包含没有 html 值的字符串

Because strip_tags() does not actually validate the HTML, partial or broken tags can result in the removal of more text/data than expected.

参见PHP manual

您的案例无效HTML。 HTML validator 表示

Bad character ' after <. Probable cause: Unescaped <. Try escaping it as &lt;.

原因是当 stripper 发现 < 后跟一个非空白字符时,它假定它在标签内。然后在标签内,如果它看到引号,它会设置一个标志 (in_q),然后查找结束对。如果它找到一个关闭对,它会取消设置 in_q 标志(in_q = 0;),但如果它没有找到它,那么它会假设它仍在引号内并消耗所有内容直到最后并将其从输出中删除.

如果您的输入字符串中有此类格式错误的标签,您最好改用正则表达式:

preg_replace('~<\S[^<>]*>~', '', $str); 

live demo here