如何使用 C# 正则表达式来替换/删除所有 HTML 标记,包括尖括号有人能请帮助我用的代码?

2009-04-25 00:23:11
问题评论:

------- stackoverflow.com/a/1732454/961234

没有显示它,但我推断,还想要删除的脚本和样式元素完全并不只是删除标记。下面的 HTML 灵活性包答案是正确的删除标记,但要删除脚本和样式,您也需要类似于stackoverflow.com/questions/13441470/...

指示重复的问题都有大量的信息 (和 Tony 小马 !),但它只要求为开始标记,并不是所有的标记。所以我不确定它是从技术上讲重复。这么说,是相同的回答︰ 不。

回答:

随时规定之前,不应使用正则表达式来处理 XML 或 HTML 文档。它们不会执行很好地使用 HTML 和 XML 文档,因为没有采用通用的方式表达嵌套的结构的方法。

您可以使用如下代码。

String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);

这适用于大多数情况下,但是都有,这不会像预期的那样的情况下 (例如 CDATA 包含尖括号)。

这是一个简单的实现.也就是说,< div 的 id ="x4 < >"> 是遗憾的是,有效的 html。尽管处理最清醒的情况下.

如所述,我意识到在某些情况下,此表达式将会失败。我不甚至可以由任何正则表达式没有错误处理一般情况下确定。

在所有情况下没有此操作将失败 !其贪婪。

@Cipher,您为什么认为 greediness 是一个问题吗?假设是有效的 HTML 标记的开头开始匹配,它将永远不会超出该标记的结尾。这是什么 [^ >] 为。

@AlanMoore html 不是"正则语言",即您不能正确匹配是有效的 html 与 regexes 的所有内容。请参见︰ stackoverflow.com/questions/590747/...

正确的答案是不这样做,请使用HTML 灵活性包.

编辑要添加︰

Shamelessly 从下面注释由 jesse,窃取并避免被指控未充分作答后所有此时间,这里简单、 可靠代码段使用的套准的合作甚至大多数 HTML 灵活性包形成,capricious 位的 HTML:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
   output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());

有很少使用正则表达式分析 HTML,不会非常麻烦,即使是在一个非传统的正则表达式引擎提供上下文意识的情况下,无法正确分析 HTML 的封存情况。您可以发展历程与正则表达式,但将需要进行手动确认。

Html 的灵活性包可以提供一个强健的解决方案,将减少了需要手动修复 naively 将 HTML 视为无上下文的语法可能会导致异常。

正则表达式可能会出现您通常所需大部分时间,但会失败上非常常见的情况。如果您能找到更好/更快比 HTML 灵活性包分析器,试试看吧,但请不到更多中断的 HTML hackery 主题世界。

HTML 的灵活性包不是使用 HTML (例如如果只能要使用的 HTML 代码片段? !) 与相关的事物的答案。

它能很好适应的 HTML 片段和它是由原始海报描述的方案中的最佳选择。正则表达式,另一方面移交,仅适用于 HTML 看到理想将中断与最有效的 HTML,因为 HTML 语法不是常规。如果他在使用 Ruby,我仍会有建议在 nokogiri 或 beautifulsoup 或 hpricot,Python。最好将 HTML 与 HTML 一样,不任意文本流,没有语法。

它不是正确答案。与 @PropellerHead 一致。

这不是一种意见。正则表达式可能会出现您通常所需大部分时间,但会失败上非常常见的情况。如果您能找到更好/更快比 HTML 灵活性包分析器,试试看吧,但请不到更多中断的 HTML hackery 主题世界。

您无法正确地标识 HTML 标记可靠而不进行解析 HTML。您是否是否了解语法的所有 html?请参阅获取"相当接近"邪恶攻击其他答案提出建议,并告诉我为什么您需要维护的。Downvoting 我因为类似二次修改快速尝试适用于您输入的示例不会使您的解决方案的正确。我偶尔会使用 regexes 生成报表从 HTML 内容或修复一些 CSS 引用使用负上匹配 & gt;限制的可能性的错误,但我们没有其他的验证;它不是一般用途。

问题是要明确回答范围太大。您是否谈论从真实的 HTML 文档,象 web 页中删除所有标记?如果是这样,则您必须为︰

  • 删除 < !DOCTYPE 声明或 <? 如果它们存在 xml 序言
  • 移除所有的 SGML 注释
  • 删除整个 HEAD 元素
  • 删除所有脚本和样式元素
  • 执行 Grabthar-知道-模拟与窗体和表的元素
  • 删除其余的标记
  • 删除 < ![CDATA [和]] > 序列的 CDATA 节但保留其内容不动

这只是我的头的顶部,我敢肯定还有更多。完成所有操作之后,您将得到的无用的空白,在其他的单词、 句子和段落一起运行在某些地方,和大块。

但是,假设您正在使用只是一个片段,并且可以侥幸只需删除所有标记,下面是我更愿意使用正则表达式︰

@"(?></?w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"

单和双报价在各自方案中的字符串匹配足以处理尖括号中属性值的问题。我看不到任何需要明确匹配的属性名称和标记内, 其他资料像 Ryan 的答案在正则表达式一样;第一种选择将处理所有。

如果您想知道关于这些(?>...)构造,它们的原子组它们使正则表达式更有效一些,但更重要的是,它们阻止失控回溯,这是您应始终注意当您混合替换和嵌套的限定符所做的事情。我并不认为,会被问题在这里,但我知道是否我不说它,别人会。;-)

此正则表达式并非完美的课程,但可能不如以往任何时候都需要。

到目前为止,这是最好的回答。海报的回答和解释了为什么一个正则表达式不应用于给定的任务。干的好。

Regex regex = new Regex(@"</?w+((s+w+(s*=s*(?:"".*?""|'.*?'|[^'"">s]+))?)+s*|s*)/?>", RegexOptions.Singleline);

来源

@JasonTrue 是正确的这,去除 HTML 标记不应通过正则表达式。

它是非常简单,以去除使用 HtmlAgilityPack 的 HTML 标记︰

public string StripTags(string input) {
    var doc = new HtmlDocument();
    doc.LoadHtml(input ?? "");
    return doc.DocumentNode.InnerText;
}

尽管我对此有点晚,我想说这也适用于如 Word 和其他 office 产品所产生的 xml。曾有过需 Word xml 处理的任何人一样也要看如何使用这因为帮助呢很多,尤其是如果您需要去除标记的内容,这正是我需要它的。

请输入您的翻译

Using C# regular expressions to remove HTML tags

确认取消