请大家看如下帖子
http://topic.csdn.net/u/20100806/15/2aaff09d-859a-4c4d-a047-bf1c60b8bad1.html?seed=647717015&r=67514950#r_67514950一并加分

解决方案 »

  1.   

    直接写在这里吧!之前看过一篇关于替换关键字的帖子,如下:
    http://topic.csdn.net/u/20090604/17/b3da6a6e-f2ab-43ca-95ef-9ac592e6226c.html我的正则需求跟上面帖子中楼主的需求基本一样,只是我不需要这一个条件:<pre></pre>标签内的内容不参与替换,如:<pre>关键字</pre>
    于是我用了过客写的正则,如下:
    (?:^|(?<!<(?:a|pre)\b[^<>]*)>)[^<>]*(?:<|$)开始我以为是没有问题的了。所以就没有去测试,后来才发现问题,
    这个正则会匹配字符窜“<a>*****</a> ”中**里面的内容请问我该如何该一下这个正则?
      

  2.   

    考虑了一下,由于在过滤关键字时要考虑忽略大小写的情况,所以还是要用双重循环,目前也只能在内循环中加个break;优化一下
    /// <summary>
    /// 处理关键字,过滤掉已添加链接的关键字
    /// </summary>
    /// <param name="src">源字符串</param>
    /// <param name="keys">关键字列表</param>
    /// <returns>关键字列表处理后结果</returns>
    private List<string> removeRepKey(string src, List<string> keys)
    {
        Regex reg = new Regex(@"(?is)<a\b[^>]*>(.*?)</a>");
        MatchCollection mc = reg.Matches(src);
        foreach (Match m in mc)
        {
            for (int i = keys.Count - 1; i >= 0; i--)
            {
                if (keys[i].ToLower() == m.Groups[1].Value.ToLower())
                {
                    keys.RemoveAt(i);
                    break;
                }
            }
        }
        return keys;
    }
    /// <summary>
    /// 给关键字加链接,同一关键字只加一次
    /// </summary>
    /// <param name="src">源字符串</param>
    /// <param name="keys">关键字列表</param>
    /// <returns>源字符串处理后结果</returns>
    private string keyAddUrl(string src, List<string> keys)
    {
        keys = removeRepKey(src, keys);
        Regex reg = new Regex(@"(?in)[^<>]+(?=(<(?!/a)[^<>]*>[^<>]*)*(<a\b|$))");
        int length = 0;
        string temp = string.Empty;
        return reg.Replace(src, delegate(Match m)
        {
            temp = m.Value;
            length = temp.Length;
            for (int i = keys.Count - 1; i >= 0; i--)
            {
                temp = Regex.Replace(temp, @"(?is)^((?:(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*)(?<tag>" + Regex.Escape(keys[i]) + @")", @"$1<a href=""http://www.test.com"" target=""_blank"" title=""${tag}"">${tag}</a>");
                if (length != temp.Length)
                {
                    keys.Remove(keys[i]);
                }
                length = temp.Length;
            }
            return temp;
        });
    }
    //调用
    string str1 = "我想加个<pre><b>c语言教程</b>,c语言</pre>还学习c语言教程,<p title=\"c语言\">c语言</p>,我想看的是C语言视频教程,其它什么<a href=\"http://www.test.com\" target=\"_blank\" title=\"C语言\">C语言</a>教程,我都不想看。我喜欢C语言,还是C语言。";
    List<string> keys = new List<string>(new string[] { "c语言", "C语言教程", "c语言视频教程" });
    string result = keyAddUrl(str1, keys);
    richTextBox2.Text = result;
      

  3.   

    修正一下过客提供的答案。
     removeRepKey这个方法中:if (keys[i].ToLower() == m.Groups[1].Value.ToLower())
                {
                    keys.RemoveAt(i);
                    break;
                }
    改成
    if (keys[i].ToLower().IndexOf(m.Groups[1].Value.ToLower())>=0)
                {
                    keys.RemoveAt(i);
                    break;
                }
    原因是:<a>abcd</a> 关键字可以可能是abc
      

  4.   

    本帖最后由 lxcnn 于 2010-08-10 21:33:40 编辑