如何过滤除特定白名单之外的所有HTML标签?

这是用于.NET。设置了IgnoreCase,未设置MultiLine。

通常我在正则表达式方面很体面,也许我的咖啡因含量低…

允许用户输入HTML编码的实体(<lt;,<amp;等),并使用以下HTML标签:

u, i, b, h3, h4, br, a, img

允许自动关闭和,带有或不带有额外的空间,但不是必需的。

我想要:

  1. 除去上面列出的那些标记之外的所有开始和结束HTML标记。
  2. 从其余标签中删除属性, 锚点可以具有href。

到目前为止,我的搜索模式(替换为空字符串):

<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>

除了开始和结束标签,这 似乎 正在剥离所有标签,但是存在三个问题:

  1. 必须包含每个允许标签的结束标签版本是很丑陋的。
  2. 属性得以保留。可以一次更换吗?
  3. 标签 开始 允许的标签名漏网之鱼。例如,“ ”和“