科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件替换文章关键字程序—优化

替换文章关键字程序—优化

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

替换文章关键字程序—优化

作者:csdn 来源:csdn 2009年12月14日

关键字: ASP.NET 问答

  • 评论
  • 分享微博
  • 分享邮件

 替换文章关键字程序—优化

思想:
对一篇文章查找搜索关键字,并进行替换,变成链接形式

要求:
1、标签内的内容不参与替换,比如: <p title="关键字"> 虽然含有关键字,但不进行替换
2、本身是链接的内容不参与替换,如: <a>关键字 </a>
3、 <pre> </pre>标签内的内容不参与替换,如: <pre>关键字 </pre>
3、尽量做到一个关键字在一篇文章中只有一个被替换成链接(因为关键字很多,都替换成链接,整篇文章十分不雅)

本人代码实现如下:
C# code
        public static string FormatBody(string body)
        {
            Regex reg = new Regex(@"(<a .+?</a>)|(<pre(>|\s).+?</pre>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            Match mat = reg.Match(body);
            List<string> str1 = new List<string>();
            List<string> str2 = new List<string>();
            int indx = 0;
            while (mat.Success)
            {
                str1.Add(body.Substring(indx, mat.Index - indx));
                str2.Add(mat.Value);
                indx = mat.Index + mat.Length;

                mat = reg.Match(body, indx);
            }
            str1.Add(body.Substring(indx));
            str2.Add("");

            StringBuilder sb = new StringBuilder();
            int p = 50, cnt, len;
            StringBuilder tmp;
            Regex reg2;
            Match mat2;

            for (int i = 0; i < str1.Count; i++)
            {
                tmp = new StringBuilder(str1[i]);

                if (Regex.Replace(tmp.ToString(), @"<.+?>", "").Length > 5)
                {
                    cnt = tmp.Length / p;
                    len = 0;
                    foreach (string _tag in Tag.AllTags)//AllTags包含了站内所有关键字
                    {
                        //str = Regex.Replace(str, @"([^<]+?)(" + _tag + ")", "$1<a href='/tag/$2.htm'>$2</a>", RegexOptions.IgnoreCase);
                        reg2 = new Regex(@"((^|>)[^<]+?)(" + _tag + ")", RegexOptions.IgnoreCase);
                        mat2 = reg2.Match(tmp.ToString());
                        if (mat2.Success)
                        {
                            tmp.Remove(mat2.Index, mat2.Length);
                            tmp.Insert(mat2.Index, mat2.Groups[1].Value + "<a href='/tag/" + mat2.Groups[2].Value + ".htm'>" + mat2.Groups[2].Value + "</a>");
                            if (++len > cnt) break;
                        }
                    }
                }
                sb.Append(tmp.ToString());
                sb.Append(str2[i]);
            }
            return sb.ToString();
        }


结果是比较满意,可有一个严重的问题——速度太慢

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章