在我正在编写的PHP应用程序中,我希望用户在文本中输入HTML和带有尖括号的文本,但是当我显示此文本时,我想让HTML标记由非-HTML标签显示为文学,例如用户应该能够输入:
<b> 5 > 3 = true</b>
显示时,用户应该看到:
5&gt; 3 =真实
解析此问题的最佳方法是什么,即找到所有非HTML括号,将它们转换为&amp; gt;和&amp; lt;?
答案 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括号并转义它们,而是首先逃避所有内容,然后查找<b>
和</b>
并且只对这些特殊情况进行转换。通过这种方式,您不会冒用户在页面中注入恶意HTML的风险(如果您试图仅仅逃避所需内容,则可能会遗漏一些重要内容)。