strip_tags php删除太多

时间:2018-11-06 07:26:17

标签: php strip-tags

包含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' 

我想要/期望的结果是:

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

你有什么想法要得到这个吗?

3 个答案:

答案 0 :(得分:1)

如果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值的字符串

enter image description here

答案 1 :(得分:0)

  

由于strip_tags()实际上并未验证HTML,因此部分或损坏的标记可能导致删除的文本/数据超出预期。

请参见PHP manual

您的情况是无效的HTML。 HTML validator

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

答案 2 :(得分:0)

原因是,当剥离器找到在非空白字符后的<时,会假定剥离器位于标记内。然后,如果在标签内看到引号,则设置一个标志(in_q),然后寻找一个闭合对。如果找到闭合对,则取消设置in_q标志(in_q = 0;),但是如果找不到,则假定它仍在引号内,并消耗掉所有内容并将其从输出中删除

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

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

请参见live demo here