我有一个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内容生成纯文本摘要。猜猜这有助于澄清这个问题。
答案 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片段。
在我将它们提取出来以显示为纯文本之前,请使用正则表达式删除html标记并保留换行符。几乎没有任何火箭科学但对我有用。