Html 如何强制元素/标记,如<;i>;及<;b>;在其父元素中关闭?

Html 如何强制元素/标记,如<;i>;及<;b>;在其父元素中关闭?,html,Html,我将允许用户提交HTML,去掉脚本和样式标签(ofc),但某些元素,如粗体和斜体,正在从用户内容所在的分区中溢出。如果他们忘了关上,我是说 例如: 用户提交: I'm entering a <b>tunne---------------- 我正在进入一个隧道---------------- 页面的结尾如下所示: <div> I'm entering a <b>tunne---------------- </b><div>&l

我将允许用户提交HTML,去掉脚本和样式标签(ofc),但某些元素,如粗体和斜体,正在从用户内容所在的分区中溢出。如果他们忘了关上,我是说

例如:

用户提交:

I'm entering a <b>tunne----------------
我正在进入一个隧道----------------
页面的结尾如下所示:

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

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


有什么想法吗?我更愿意解决这个问题,而不必编写解析器来查找未关闭的标记。

您可以使用类似的html消毒剂来清理和修复您的源代码。

AFAIK的另一个选项是

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

<b>foo <i>bar</b> baz</i>
foobarbaz
它是否应该将标记保留在适当的位置并将其渲染为

foo-barbaz

,还是浏览器应该假定
标记是子标记并移动其结束标记?或者,用户的意思是
是孩子,并移动其结束标记

如果您打算允许用户标记,并且希望避免呈现问题,那么您可以计算开始/结束标记的总数,以确保它们平衡(如果不平衡,则去掉所有标记),或者使用更可靠的服务,如上面的Horen回答


另外,允许用户提交HTML可能是非常不明智的。即使你将某些标签列入黑名单,也可能会有一大堆标签未被公开。最好让用户输入限制标记或BBcode,然后将您允许的字符转换为HTML。

我实际上不使用PHP,因此这对我没有帮助。我确实提到我不喜欢编写解析器,但是使用也没有我的偏好。无论如何谢谢你!仅供参考:Tidy实际上是一个用C编写的库,有许多编程语言可以使用,因为它们都是内联标记,应该允许它们交错。但我想让它们停在它们周围的块元素上。我甚至可以使用一个特殊的block元素来包含它们。考虑到这是不明智的,这可能是真的。默认情况下,它们是内联的,但它们可以设置为block,就像
s可以与CSS内联一样。问题是,不幸的是,浏览器没有足够的知识来做出决定!浏览器确实知道某些东西最终是内联的还是非内联的。无论如何,如果阻塞->子对象必须在内部关闭。或者:如果监狱->孩子们必须关在里面。也许它不存在。