如何删除所有标签并获取纯文本?
Posted
技术标签:
【中文标题】如何删除所有标签并获取纯文本?【英文标题】:How to remove all tags and get the pure text? 【发布时间】:2013-04-30 15:42:53 【问题描述】:我必须以html and CSS
格式将用户输入文本存储在我的数据库中。
案例是:
RadEditor,用户将文本从 MSWord 复制到此编辑器,然后我将此文本以该格式存储在数据库中。然后当检索报告中的数据或某些标签时,一些标签会出现在文本周围!!
我使用正则表达式来删除所有格式,但它有时会成功,但并非总是成功。
private static Regex oClearHtmlScript = new Regex(@"<(.|\n)*?>", RegexOptions.Compiled);
public static string RemoveAllHTMLTags(string sHtml)
sHtml = sHtml.Replace(" ", string.Empty);
sHtml = sHtml.Replace(">", ">");
sHtml = sHtml.Replace("<", "<");
sHtml = sHtml.Replace("&", "&");
if (string.IsNullOrEmpty(sHtml))
return string.Empty;
return oClearHtmlScript.Replace(sHtml, string.Empty);
我问如何使用HTMLAgility 或任何可靠的方式删除所有格式以确保文本是纯的?
Note:
数据库中该字段的数据类型为Lvarchar
【问题讨论】:
在我的回答中添加了另一个建议,因为第一个似乎不起作用。 【参考方案1】:这应该会从字符串中删除所有 html 标记。
sHtml = Regex.Replace(sHtml, "<.*?>", "");
【讨论】:
还是同样的问题,例如:<span style="font-size: 16pt; font-family: Simplified
它必须是有效的 HTML 标记 - 以 <
开头并以 >
结尾。例如,<span style="font-size: 16pt; font-family: Simplified">test</span>
结果test
从word复制到编辑<p style="margin-right: 3.5in; text-align: left; text-indent: 0.5in; line-height: 150%; direction: rtl; unicode-bidi: embed;" dir="RTL"><strong><span style="line-height: 150%;">رقم</span></strong></p><p style="margin-right: 3.5in; text-align: left; text-indent: 0.5in; line-height: 150%; direction: rtl; unicode-bidi: embed;" dir="RTL"><strong><span style="line-height: 150%;">&nbsp;&nbsp;</span></strong></p><p style="text-align: right; line-height: 150%; direction: rtl; unicode-bidi: embed;" dir="RTL"><strong><span style="line-height: 150%;">&nbsp;</span>
</strong></p><p style="text-align: right; direction: rtl; unicode-bidi: embed;" dir="RTL"><span style="font-size: 16pt; font-family: Simplified Arabic,serif;">&nbsp;</span></p><p style="text-align: right; direction: rtl; unicode-bidi: embed;" dir="RTL"><strong><span style="font-size: 16pt; font-family: Simplified Arabic,serif;">أحمد</span></strong></p><p style="margin-right: 2.5in; text-align: right; text-indent: 0.5in; direction: rtl; unicode-bidi: embed;" dir="RTL"><strong><span style="font-size: 16pt; font-family: Simplified Arabic,serif;">&nbsp; </span></strong><strong> </strong></p>
<p style="text-align: right; direction: rtl; unicode-bidi: embed;" dir="RTL"><span style="font-size: 16pt; font-family: Simplified Arabic,serif;">&nbsp;</span></p><p style="text-align: right; direction: rtl; unicode-bidi: embed;" dir="RTL"><strong><span style="font-size: 16pt; font-family: Simplified Arabic,serif;">تحية </span></strong></p><p style="text-align: right; direction: rtl; unicode-bidi: embed;" dir="RTL"><span style="font-size: 16pt; font-family: Simplified Arabic,serif;">نكتب </span>
【参考方案2】:
HtmlAgility 包使处理 HTML 变得容易。
HtmlDocument mainDoc = new HtmlDocument();
string htmlString = "<html><body><h1>Test</h1> more text</body></html>"
mainDoc.LoadHtml(htmlString);
string cleanText = mainDoc.DocumentNode.InnerText;
【讨论】:
【参考方案3】:This post 推荐以下方法(并且似乎已被接受)。
Regex.Replace(myHTMLString, @"<p>|</p>|<br>|<br />", "\r\n", );
Regex.Replace(myHTMLString, @"<.+?>", string.Empty);
鉴于您仍然遇到困难,您可以尝试实例化 RadEditor 并使用 .Text 属性。我以前没有使用过 RadEditor,但我做了一些挖掘——你能试试这样的吗L
RadEditor editor = new RadEditor();
editor.Content = myHTMLString;
string plainText = editor.Text;
这可能是一项非常昂贵的操作,但我很想知道它是否有效!
【讨论】:
还是同样的问题,例如:<span style="font-size: 16pt; font-family: Simplified
【参考方案4】:
请参阅我的回答 here,了解如何使用 Agility Pack 完成此操作。 您可能需要稍微更改代码,以免删除少于两个字符的单词。此外,换行符也将被删除,因此您将留下一长行文本。
【讨论】:
以上是关于如何删除所有标签并获取纯文本?的主要内容,如果未能解决你的问题,请参考以下文章
Python/BeautifulSoup - 如何从元素中删除所有标签?