我有一些代码可以从文本中删除HTML标记。我不关心内容(脚本,CSS,文本等),至少就目前而言,重要的是标签本身被剥离了。
这可能正在进入微优化的剧场,但是这个代码是少数几个会经常针对大量数据运行的函数之一,因此任何百分比的节省都可以从整体中节省下来应用程序的观点。
目前的代码如下:
public static string StripTags(string html)
{
var currentIndex = 0;
var insideTag = false;
var output = new char[html.Length];
for (int i = 0; i < html.Length; i++)
{
var c = html[i];
if (c == '>')
{
insideTag = false;
continue;
}
if (!insideTag)
{
if (c == '<')
{
insideTag = true;
continue;
}
output[currentIndex] = c;
currentIndex++;
}
}
return new string(output, 0, currentIndex);
}
我在这里错过了任何明显的.net技巧吗?有关信息,请使用.net 4。
非常感谢。
答案 0 :(得分:2)
在此代码中,您逐个复制字符。您可以通过仅检查当前部分(内部或外部html)结束的位置,然后使用Array.copy一次性移动整个块来加快速度,这将启用较低级别的优化。 (例如,在64位上,它可以在一个处理器周期中复制4个unicode字符(4 * 2 * 8位))。标签之间的文本位可能非常大,因此可能会增加。
还提到了某个地方提到的stringbuilder文档,因为它在框架中实现而不是在C#中,它具有无法在托管C#中复制的性能。不知道如何追加你可能会看到的块。
关心Gert-Jan
答案 1 :(得分:0)
您应该查看以下库,因为它似乎是与.NET中的html文件进行交互的最佳方式:http://htmlagilitypack.codeplex.com/
答案 2 :(得分:0)
不解决不存在的问题。
这种方法会被调用多少次?许多!多少?几千?不足以保证优化。
你可以做一个Parallel.For并根据机器加速3-5次吗?可能。
您的代码是否依赖于许多其他代码?肯定。
你有可能这样:
// Some slow code
StripTags(s); // Super fast version
// Some more slow code here
那么你的StripTags有多快了吗?
你从文件中获取它们吗?你是从网络上得到它们的吗?很少有瓶颈是你的原始CPU能力。
让我重复一遍:
不解决不存在的问题!
答案 3 :(得分:-1)
您也可以对其进行编码:
string encodedString = Server.HtmlEncode(stringToEncode);
看看这里:http://msdn.microsoft.com/en-us/library/ms525347%28v=vs.90%29.aspx
答案 4 :(得分:-2)
Google搜索remove html from string会产生许多关于使用正则表达式的链接,所有链接都与以下内容类似:
public string Strip(string text)
{
return Regex.Replace(text, @”<(.|\n)*?>”, string.Empty);
}