处理混合HTML和用户输入的最佳方法?

时间:2008-11-19 09:25:48

标签: php parsing

在我正在编写的PHP应用程序中,我希望用户在文本中输入HTML和带有尖括号的文本,但是当我显示此文本时,我想让HTML标记由非-HTML标签显示为文学,例如用户应该能够输入:

<b> 5 > 3 = true</b>

显示时,用户应该看到:

5&gt; 3 =真实

解析此问题的最佳方法是什么,即找到所有非HTML括号,将它们转换为&amp; gt;和&amp; lt;?

3 个答案:

答案 0 :(得分:2)

我建议让用户输入BBcode样式标记,然后用html标签替换:

[b]This is bold[/b]
[i]this is italic with a > 'greater than' sign there[/i]

这使您可以更好地控制如何将用户的输入解析为html,但我承认这看起来像是一种不必要的负担。

答案 1 :(得分:1)

如果你允许用户输入HTML,你必须解决比一些未转义的角度括号更大的问题; HTML非常难以正确验证和过滤,如果你做得不对,那么你就可以开启自己的XSS攻击了。我写了一个这样做的图书馆;其他人已经在这里发布了链接,所以我不会重申。

然而,要回答你的问题,将离散角度括号转换为其转义形式的最简单方法是使用DOM / libxml解析HTML,然后重新序列化它。任何使用正则表达式的东西都将注定要失败。您也可以编写自己的解析器,但这也需要一些工作。

答案 2 :(得分:0)

最好的方法是做相反的事情:不是找到非HTML括号并转义它们,而是首先逃避所有内容,然后查找&lt;b&gt;&lt;/b&gt;并且只对这些特殊情况进行转换。通过这种方式,您不会冒用户在页面中注入恶意HTML的风险(如果您试图仅仅逃避所需内容,则可能会遗漏一些重要内容)。