我有一个由用户通过富文本编辑器输入的 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 个字符,并且保留换行符。到目前为止我能实现的是使用正则表达式去除所有 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

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

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

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

其他提示

我想我会如何解决这个问题是看它,就好像它是一个简单的浏览器。创建一个基Tag类,使之与抽象的也许InnerHTML属性和虚拟方法PrintElement。

接下来,创建你关心的每个HTML标签类,并从基类继承。从你的例子来看,你最关心的标签是H1,P,A,和小时。实施PrintElement方法,使得它返回打印出正确基于的innerHTML的元件(例如P类PrintElement将返回‘\ n [innerHTML的]的\ n’)。一个字符串

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

最后,经过您的队列调用每个元素的方法PrintElement

可能更多的工作比你计划,但它是一个更强大的解决方案比单纯使用正则表达式,你应该决定改变主意在未来和希望展示简约的造型,它只是一个要回去和修改你的事PrintElement方法。

有关信息,剥离HTML用正则表达式是......充满了微妙的问题。的 HTML敏捷性包可以是更健壮的,但是从字仍然遭受出血在一起:

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

的一种方法是在三个步骤中剥离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 </.*>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top