在新浪、腾讯等门户网站上浏览新闻的时候,尤其是体育类新闻。
经常看到一些体育明星、球队名称等信息加上了相应的链接,指向该明星的介绍页面。
如下:
如今进行的项目中也要开发一个类似功能,给相应的关键词加上对应的链接,简单的思考了下,有以下几个步骤:
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; }
简单的测试结果如下: