【问题标题】:Why does PHP function strip_tags() removes data that is not tags? How to avoid this?为什么 PHP 函数 strip_tags() 会删除不是标签的数据?如何避免这种情况?
【发布时间】:2013-05-23 10:44:21
【问题描述】:

这段代码:

$input = 'I love <3 PHP!';
echo strip_tags($input);

输出:

I love 

是否有一个 PHP 函数(或任何人的自定义函数)将只删除标签(这意味着正确关闭的标签),而不是 &lt; 前面的所有内容?

【问题讨论】:

标签: php


【解决方案1】:

为什么 PHP 函数 strip_tags() 会删除不是标签的数据?

它在安全方面犯了错误。

如何避免这种情况?

如果您希望输入文本,请使用htmlspecialchars转义 &lt; 字符(和其他一些字符),而不是删除它们。

【讨论】:

  • 我不想这样做,因为我将用户输入传递给 PHP markdown,它从 &gt; this text 创建 cmets,就像 StackExchange 上的这里一样。当我将输入转换为特殊字符时,这种情况不再发生。我需要找到中间立场。我会接受任何能解决这种情况的答案。
  • 为什么不能将用户输入直接传递给markdown解析器?如果它是一个不错的解析器,它应该为你做所有的清理工作。
  • @Spudley:它不应该删除标签。
【解决方案2】:

试试htmlspecialchars,它仍然会显示标签,但会转换为html实体

【讨论】:

    【解决方案3】:

    从 PHP 5 开始,Tidy 扩展通常在大多数编译的二进制文件中都可用。它不是 100% 有效,但在这种情况下可以帮助您。 Tidy 尝试关闭字符串中所有未关闭的 HTML 标记。关闭它后,您可以忽略想要的标签。然后,您需要去掉 tidy 放入的最终标签。

    Tidy documentation

    $str = tidy("I <3 PHP");
    
    // second param ignores the closed tag <3>
    $str = strip_tags($str, '<3>')
    
    $str = str_replace('<3>', '<3', $str);
    
    echo $str;
    

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多