从HTML正文中提取文本片段(在.NET中)

时间:2009-08-06 04:10:13

标签: asp.net html regex string html-content-extraction

我有一个HTML内容,由用户通过richtext编辑器输入,因此它几乎可以是任何东西(少于那些不应该在body标签之外,不用担心“head”或doctype等)。 此内容的一个示例:

<h1>Header 1</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />
<h1>Header 2</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />

诀窍是,我只需要提取文本的前100个字符(HTML标签被剥离)。我还需要保留换行符,不要破坏任何单词。

所以上面的输出将是:

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

它有98个字符,并保留换行符。到目前为止我可以实现的是使用正则表达式删除所有HTML标记:

Regex.Replace(htmlStr, "<[^>]*>", "")

然后使用正则表达式修剪长度:

Regex.Match(textStr, @"^.{1,100}\b").Value

我的问题是,如何保留换行符?我得到一个输出:

Header 1
Some text hereSome more text here
A link here
Header 2
Some text hereSome more text

注意加入句子?也许有人可以告诉我其他解决这个问题的方法。谢谢!

其他信息:我的目的是从一堆HTML内容生成纯文本摘要。猜猜这有助于澄清这个问题。

4 个答案:

答案 0 :(得分:2)

我认为如何解决这个问题就好像它是一个简单的浏览器一样。创建一个基类Tag类,使其具有InnerHTML属性和虚拟方法PrintElement。

接下来,为您关心并从基类继承的每个HTML标记创建类。从您的示例来看,您最关心的标签是h1,p,a和hr。实现PrintElement方法,使其返回一个字符串,该字符串根据InnerHTML正确打印出元素(例如p类'PrintElement将返回'\ n [InnerHTML] \ n“)。

接下来,构建一个解析器,它将解析HTML并确定要创建的对象,然后将这些对象添加到队列中(树会更好,但看起来不是为了您的目的)。

最后,遍历队列,为每个元素调用PrintElement方法。

可能比您计划的工作量更多,但它比简单地使用正则表达式更加强大,而且如果您决定在未来改变主意并希望展示简单的样式,那么只需返回并修改您的PrintElement方法。

答案 1 :(得分:1)

有关信息,使用正则表达式剥离html是......充满了微妙的问题。 HTML Agility Pack可能更强大,但仍然会出现同时出血的话:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.InnerText;

答案 2 :(得分:0)

一种方法是通过三个步骤去除html:

Regex.Replace(htmlStr, "<[^/>]*>", "") // don't strip </.*>
Regex.Replace(htmlStr, "</p>", "\r\n") // all paragraph ends are replaced w/ new line
Regex.Replace(htmlStr, "<[^>]*>", "") // replace remaining </.*>

答案 3 :(得分:0)

好吧,我需要关闭它,虽然没有理想的解决方案。由于我的应用程序中使用的HTML标签是非常常见的(没有表格,列表等),很少或没有嵌套,我所做的是在用户输入后保存之前预先格式化HTML片段。

  • 删除所有换行符
  • 为所有块标记添加换行符前缀(例如div,p,hr,h1 / 2/3/4等)

在我将它们提取出来以显示为纯文本之前,请使用正则表达式删除html标记并保留换行符。几乎没有任何火箭科学但对我有用。