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

如今进行的项目中也要开发一个类似功能,给相应的关键词加上对应的链接,简单的思考了下,有以下几个步骤:
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;
}
简单的测试结果如下:
