在新浪、腾讯等门户网站上浏览新闻的时候,尤其是体育类新闻。
经常看到一些体育明星、球队名称等信息加上了相应的链接,指向该明星的介绍页面。
如下:

如今进行的项目中也要开发一个类似功能,给相应的关键词加上对应的链接,简单的思考了下,有以下几个步骤:
1、词库行程(体育明星、球队等);
2、保存内容时候加自定义标签;
3、页面展示时替换标签为链接。
列出代码如下,内容稍后完善。
关键词的定义:
class="brush:csharp;gutter:true;">/// <summary>
/// 关键词信息
/// </summary>
public class KeywordItem {
    /// <summary>
    /// 关键词类型(对应明星、球队等)
    /// </summary>
    public byte WordType { set; get; }
    /// <summary>
    /// 关键词内容(如:科比、湖人等)
    /// </summary>
    public string Word { set; get; }
    /// <summary>
    /// 链接信息ID(如:科比在球员数据库的ID,湖人在球队数据库的ID等)
    /// </summary>
    public int ItemId { set; get; }
}
给文章内容加上自定义标签的方法:
        /// <summary>
        /// 保存内容时,对内容进行关键词标记处理
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        public static string BuildContent(string content) {
            //关键词库
            var list = xxxx;//从缓存中取得(汇集了球员、球队等不同来源)          
                string endTag = "</ka>";
                foreach (KeywordItem item in list) {
                    int index = content.IndexOf(item.Word, StringComparison.Ordinal);
                    if (index > -1) {
                        //判断当前词根是否已加标记
                        int tagIndex = index + item.Word.Length; //词根结束索引
                        int endTagLength = endTag.Length; //结束标记长度
                        if (tagIndex + endTagLength > content.Length) {
                            content = content.Replace(item.Word, string.Format("<ka data='{0}_{1}'>{2}</ka>", item.WordType, item.ItemId, item.Word));
                        } else {
                            if (content.Substring(tagIndex, endTagLength) != endTag) {
                                string addStr = string.Format("<ka data='{0}_{1}'>", item.WordType, item.ItemId);
                                content = content.Insert(index, addStr);
                                content = content.Insert(index + addStr.Length + item.Word.Length, endTag);
                            }
                        }
                    }
                }          
            return content;
        }
展示时替换自定义标签为超链接:
/// <summary>
        /// 展示内容时,替换关键词标记为超链接
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        public static string ShowContent(string content) {
            var regexKka = new Regex(@"<ka data='(?<type>\d+)_(?<itemid>\d+)'>(?<word>\S+)</ka>", RegexOptions.IgnoreCase);
            MatchCollection mc = regexKka.Matches(content);
            if (mc != null && mc.Count > 0) {
                foreach (Match item in mc) {
                    byte type = Convert.ToByte(item.Groups["type"].Value);
                    long itemid = Convert.ToInt64(item.Groups["itemid"].Value);
                    string word = item.Groups["word"].Value;
                    string baseText = string.Format("<ka data='{0}_{1}'>{2}</ka>", type, itemid, word);
                    string toText = null;
                    switch (type) {
                        case 1:
                            toText = string.Format("<a href='http://xxx.com/player/{0}.html'>{1}</a>", itemid, word);
                            break;
                    }
                    content = content.Replace(baseText, toText);
                }
            }
            return content;
        }
简单的测试结果如下:
