使用 ASP.NET,如何可靠地从给定的字符串中剥离 HTML 标记(不使用正则表达式)?我正在寻找类似于 PHP 的
示例:
"Hello"
我试图不重复造轮子,但目前还没有找到符合我的需求的解决方案。
strip_tags
的东西。示例:
<ul><li>Hello</li></ul>
输出:"Hello"
我试图不重复造轮子,但目前还没有找到符合我的需求的解决方案。
strip_tags
的东西。<ul><li>Hello</li></ul>
输出:如果只是从一个字符串中剥离所有HTML标签,使用正则表达式也可以可靠地实现。将以下内容替换:
<[^>]*(>|$)
使用空字符串进行全局替换。不要忘记在此之后规范化字符串,替换为:
[\s\r\n]+
用单个空格分隔,并修剪结果。可选地,将任何HTML字符实体替换回实际字符。
注意:
>
。当遇到这样的值时,此解决方案将返回损坏的标记。"e;
。 我会将其与 WebUtility.HtmlDecode
结合使用(它本身不会删除标签)。请在删除标签后使用它,因为它可能会重写 >
和 <
。例如:WebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
。 - Yahoo Serious现在就去下载HTMLAgilityPack吧! ;) 下载链接
它可以使你加载和解析HTML。然后你可以浏览DOM并提取所有属性的内部值。说真的,最多只需要10行代码就能实现。这是目前最棒的免费.NET库之一。
以下是一个示例:
string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlContents);
if (doc == null) return null;
string output = "";
foreach (var node in doc.DocumentNode.ChildNodes)
{
output += node.InnerText;
}
text()
节点,修剪内容并使用空格将它们连接起来。IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
- jessehouwingif (doc == null)
检查?这总是false,不是吗? 为什么要进行 if (doc == null)
检查?这总是false,不是吗? - avesseRegex.Replace(htmlText, "<.*?>", string.Empty);
RegexOptions.SingleLine
运行,否则对于跨越多行的标签处理不好。 - ChrisFprotected string StripHtml(string Txt)
{
return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty);
}
Protected Function StripHtml(Txt as String) as String
Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty)
End Function
我已经在asp.net论坛上发布了这个问题,并且它似乎仍然是最简单的解决方案之一。我不能保证它是最快或最有效的,但它非常可靠。在.NET中,您可以使用HTML Web控件对象本身。你只需要将你的字符串插入一个临时的HTML对象,比如DIV,然后使用内置的'InnerText'来获取所有不包含在标签中的文本。以下是一个简单的C#示例:
System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;
如果您不能使用HtmlAgilityPack,.NET的XML读取器是一个选择。但这种方式可能在格式良好的HTML上失败,所以请始终添加一个带有正则表达式的catch语句作为备用方案。请注意,这并不快速,但确实提供了一个很好的机会来进行老派的逐步调试。
public static string RemoveHTMLTags(string content)
{
var cleaned = string.Empty;
try
{
StringBuilder textOnly = new StringBuilder();
using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>")))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Text)
textOnly.Append(reader.ReadContentAsString());
}
}
cleaned = textOnly.ToString();
}
catch
{
//A tag is probably not closed. fallback to regex string clean.
string textOnly = string.Empty;
Regex tagRemove = new Regex(@"<[^>]*(>|$)");
Regex compressSpaces = new Regex(@"[\s\r\n]+");
textOnly = tagRemove.Replace(content, string.Empty);
textOnly = compressSpaces.Replace(textOnly, " ");
cleaned = textOnly;
}
return cleaned;
}
string result = Regex.Replace(anytext, @"<(.|\n)*?>", string.Empty);
&
这样的实体又该怎么办呢?如果你想将HTML转换为纯文本,你需要解码实体。
因此,我提出以下方法。
使用HtmlAgilityPack,这个扩展方法可以高效地从html片段中删除所有HTML标记。还可以解码HTML实体,例如&
。仅返回内部文本项,并在每个文本项之间加入一个新行。
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
<script>
、<style>
、<svg>
、<head>
和<object>
),因为它们可能不包含我们想要的可读内容。你在这方面所做的将取决于你的情况和你想要达到的目标,但使用HtmlAgilityPack,白名单或黑名单选择标签将非常容易。>
变成 >
等)。对于那些抱怨Michael Tiptop的解决方案无法工作的人,这里是使用.Net4+的方法:
public static string StripTags(this string markup)
{
try
{
StringReader sr = new StringReader(markup);
XPathDocument doc;
using (XmlReader xr = XmlReader.Create(sr,
new XmlReaderSettings()
{
ConformanceLevel = ConformanceLevel.Fragment
// for multiple roots
}))
{
doc = new XPathDocument(xr);
}
return doc.CreateNavigator().Value; // .Value is similar to .InnerText of
// XmlDocument or JavaScript's innerText
}
catch
{
return string.Empty;
}
}