优化C#中的HTML标记删除

时间:2011-09-01 14:28:42

标签: c# optimization

我有一些代码可以从文本中删除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。

非常感谢。

5 个答案:

答案 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);
}