1

我有一个 HTML 内容,由用户通过富文本编辑器输入,因此它几乎可以是任何内容(除了那些不应该在 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 个字符,并保留了换行符。到目前为止,我可以实现的是使用 Regex 去除所有 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

4 回答 4

2

我想解决这个问题的方法是把它看作是一个简单的浏览器。创建一个基本的 Tag 类,用一个 InnerHTML 属性和一个虚拟方法 PrintElement 使其抽象。

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

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

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

可能比您计划的要多,但它是一个比简单使用正则表达式更强大的解决方案,如果您决定在未来改变主意并想要显示简单的样式,只需返回并修改您的 PrintElement 方法。

于 2009-08-06T15:00:54.940 回答
1

对于信息,用正则表达式剥离 html 是......充满了微妙的问题。HTML Agility Pack可能更健壮,但仍然受到以下词语的影响:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.InnerText;
于 2009-08-06T04:14:29.883 回答
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 </.*>
于 2009-08-06T04:26:46.923 回答
0

好吧,尽管没有理想的解决方案,但我需要关闭它。由于我的应用程序中使用的 HTML 标记非常常见(没有表格、列表等),几乎没有嵌套,所以我所做的是在用户输入后保存 HTML 片段之前预先格式化它们。

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

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

于 2009-10-04T09:16:06.987 回答