使用 strip_tags() 和 preg_replace() 显示所见即所得/TinyMCE 文本编辑器中输入的文本


Using strip_tags() and preg_replace() to display text entered in a WYSIWYG/TinyMCE Text Editior

早上好,

问题是这样的:我有一些文本是通过文本编辑器(所见即所得/TinyMCE)输入的,并作为帖子显示在其他地方。 我们遇到的问题是文本在显示为帖子时会丢失其格式。 在挖掘代码后,我发现这是通过 strip_tags() + echo preg_replace() 组合完成的。 我仍然是PHP的新手,但我能够弄清楚:

  • strip_tags() 正在取出格式(b/c就是这样滚动的)
  • 我可以添加并显示粗体和斜体文本
  • 带下划线和删除线的文本是 CSS 样式,将代码(因为它保存在数据库表上)添加到 strip_tags() 列表中并没有解决问题

我的问题是:我可以修改现有代码来解决这个问题,还是应该使用其他东西(htmlentities())?

编辑:我尝试了html实体,但它失败了。编辑:我只添加了标签,问题解决了50%。 我的文本带有下划线,但它显示的文本低于其后面的无下划线文本。 就好像带下划线的文本被视为潜台词或其他东西一样。

代码片段:

    <div class="display_text_area">
        <?php $text = strip_tags(str_ireplace("</p>", "</p><br/>", 
              $text_detail->description),
              '<font><ul><li><br/><strong><em><span style="text-decoration: underline;">'); ?>
        <?php echo preg_replace('/(<br[^>]*>'s*){2,}/', '<br/>', $text); ?>
    </div>

我在这里留下标签以表明 (a) 我试过了,(b) 它不起作用。 所以(c)我知道它需要被删除或修改。

提前非常感谢。

关键是TinyMCE返回名义上有效的富HTML,在HTML页面中使用之前不需要剥离或转义。 但是,您不能假设TinyMCE编辑器正在客户端上运行,因为您可能会被直接发布包含XSS攻击的响应的人利用。

IIRC,TinyMCE默认返回XHTML。 您需要使用诸如HTML Purifier之类的库来确保任何返回的HTML都是正确的。