如何强制像<i>和<b>这样的元素/标签在其父元素中关闭?</b> </i>

时间:2013-11-09 18:36:30

标签: html

我将允许用户提交HTML,删除脚本和样式标签(ofc),但某些元素(如Bold和Italic)正在溢出用户内容所在的DIVision。如果他们忘了关闭他们,我的意思是。

示例:

用户提交:

I'm entering a <b>tunne----------------

页面最终如下:

<div>
    I'm entering a <b>tunne----------------
</b><div><b> **rest of the page**

因此页面的其余部分变为粗体。我对这种行为感到困惑(为什么这些东西不留在他们的笼子里?)。我需要一个简洁的解决方案。我希望有一个笼子标签,但没有。使用iframe是非常不合适的。

有什么想法吗?我更愿意在不编写解析器的情况下解决这个问题,以找到未关闭的标签。

2 个答案:

答案 0 :(得分:1)

不幸的是,没有办法强制浏览器为您解释不平衡标签。采取这种情况:

<b>foo <i>bar</b> baz</i>

是否应将标签留在原位并将其渲染为

foo bar baz

,或者浏览器是否认为<i>标记是子标记并移动其结束标记?或者也许用户意味着<b>是孩子并移动其结束标签?

如果您要允许用户标记并且您希望避免渲染问题,那么您可以计算打开/关闭标记的总数以确保它们达到平衡(如果不这样做,则删除所有标记) ,或采用像上面Horen的回答更加防弹的服务。

此外,允许用户提交HTML可能非常不明智。即使你将某些标签列入黑名单,也可能会有一大堆other exploits被打开。让用户输入受限制的Markdown或BBcode,然后将允许的字符转换成HTML格式要好得多。

答案 1 :(得分:0)

您可以使用像php tidy这样的html清理程序来清理和修复您的源代码 AFAIK的另一个选择是HTML Purifier