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