文章内容中关键字替换为锚链接

11 篇文章 0 订阅

1:同一关键字只替换一次

2:解决关键字之间相互包含重复替换的问题


//调用

            #region 处理锚文本

            List<string> keys = new List<string>();
            DataTable dtKeyWord = 查询到的关键字;
            for (int i = 0; i < dtKeyWord.Rows.Count; i++)
            {
                keys.Add(dtKeyWord.Rows[i]["KeyWord"].ToString());
            }
            string str1 = content.Value;
            keys = removeRepKey(str1, keys);
            model.Content = keyAddUrl(str1, keys);
            #endregion

//具体方法

/// <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);
                    }
                }
            }
            return keys;
        }

        /// <summary>
        /// 给关键字加链接,同一关键字只加一次
        /// </summary>
        /// <param name="src">源字符串</param>
        /// <param name="keys">关键字列表</param>
        /// <returns>替换后结果</returns>
        private string keyAddUrl(string src, List<string> keys)
        {
            Regex reg = new Regex(@"(?in)[^<>]+(?=(<(?!/(pre|a))[^<>]*>[^<>]*)*(<(a|pre)\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--)
                {
                    string[] str = GetDesAndLink(keys[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='wodelianjie' target='_blank' class=\"a_cont\" title='wodetitle'>${tag}</a>");
                    if (length != temp.Length)
                    {
                        keys.Remove(keys[i]);
                    }
                    length = temp.Length;
                }
                return temp;
            });
        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值