使用C#中的Regex从HTML中检索特殊的InnerText

时间:2014-02-11 17:47:56

标签: c# html regex

我有一个HTML文件,我正在尝试从每个标记中检索有效的innertext。我使用正则表达式使用以下模式:

(?<=>).*?(?=<)

它适用于简单的innertext。但是,我最近遇到了以下HTML部分:

<div id="mainDiv"> << Generate Report>> </div>
<input id="name" type="text">Your Name->></input>

我不确定,如何使用正则表达式检索这些innertexts?有人可以帮忙吗?

由于

3 个答案:

答案 0 :(得分:1)

这就是为什么你不使用正则表达式来解析html的原因。尽管你可以通过在正则表达式中使用反向引用来解决这个问题

(?<=<(\w+)[<>]*>).*?(?=/<\1>)

虽然那不总是因为

  • 标签不会总是有结束标签
  • 标记属性可以包含&lt;&gt;
  • 标记名称周围的任意空格

使用像htmlagilitypack

这样的html解析器

您的代码就像这个

一样简单
HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
//InnerText of all div's
List<string> divs=doc.DocumentElement
                     .SelectNodes("//div")
                     .Select(x=>x.InnerText).ToList();

答案 1 :(得分:1)

我会使用解析器,但RegEx可以使用以下内容:

<([a-zA-Z0-9]+)(?:\s+[^>]+)?>(.+?)<\/\1>

然后您可以使用捕获组2获取内部文本。

答案 2 :(得分:1)

您可以随时删除HTML标记,这些HTML标记可以通过常规语法描述,而HTML则不能。替换“&lt; [a-zA-Z] [a-zA-Z0-9] * \ s *([a-zA-Z] + \ s * = \ s *(”|')(?(“| ')(?&lt; =)。|。)(“|')\ s *)* /?&gt;”with string.Empty。

该正则表达式应匹配任何有效的HTML标记。

编辑: 如果您不想获得连锁结果,可以使用“&lt;”而不是string.Empty然后由'&lt;'拆分因为'&lt;'在HTML中始终启动标记,不应该显示。或者你可以使用Regex.Replace的重载来获取委托并使用匹配索引和匹配长度(这可能会更加优化)。或者甚至更好地使用Regex.Match并从匹配的标签转到匹配的标签。 substring(PreviousMatchIndex + PreviousMatchLength,CurrentMatchIndex - PreviousMatchIndex + PreviousMatchLength)应该提供内部文本。