请问关键字高亮的高效实现方式?? 本帖最后由 dreams1981 于 2010-04-09 17:28:10 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //搜索关键词高亮显示函数 public static string HighLightKeyWord(string pain,string keyword) { //搜索关键词高亮函数By JN 2006.11.30 System.Text.RegularExpressions.MatchCollection m = Regex.Matches(pain, keyword, RegexOptions.IgnoreCase); //忽略大小写搜索字符串中的关键字 for (int j = 0; j < m.Count; j++)//循环在匹配的子串前后插东东 { //j×31为插入html标签使pain字符串增加的长度: pain = pain.Insert((m[j].Index + keyword.Length + j * 31), "</font>");//关键字后插入html标签 pain = pain.Insert((m[j].Index + j * 31), "<font color=#ff0000>");//关键字前插入html标签 } //搜索关键词高亮函数By JN 2006.11.30 return pain; }第二个是JS 的解决办法http://hi.baidu.com/yisqiu/blog/item/f8be5c60359c3fdf8db10da7.htmlhttp://www.blogjava.net/faithwind/archive/2007/06/26/126387.html jquery 支持 css 选择其 xpath 查询 语法可以很准确的帮助你定位需要的目标集合。 #1楼 wosizy 的方法不行,报:“索引超出范围。必须为非负值并小于集合大小。参数名: startIndex ”错的 foren_whb 我是想看看这里应该也有人处理过这样的问题的 Regex.Replace("", "(?i)(?<![><][^<>]*)", "<a>$&</a>");http://topic.csdn.net/u/20091028/13/df7cd47d-0f30-4361-9695-a6aa547b8d7a.html 闻着内容而至不知道楼主要在前台处理,还是在后台处理//后台C#处理方法string keyword = "2004";string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";Regex reg = new Regex(@"(?:^|>)[^<>]*(?:<|$)");string result = reg.Replace(test, delegate(Match m) { return m.Value.Replace(keyword, "<font color='red'>" + keyword + "</font>"); });Response.Write(result);//前台javascript处理方法<script type="text/javascript"> var keyword = "2004";var str ="<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";var re = /(?:^|>)[^<>]*(?:<|$)/g;str = str.replace(re, function($0){ return $0.replace(keyword, "<font color='red'>" + keyword + "</font>");});document.write(str);</script> 我对其它方式不是很了解,但如果楼主对效率要求较高,而要处理的内容很规范的话,可以考虑XML或xpath等方式处理,会比正则效率高XML等方式优势在于处理效率高,局限性在于对格式要求严格,处理不了格式不规范的内容正则表达式优势在于通用,能处理不规范的内容,但由此而牺牲了一定的性能,尤其是在对正则不了解,语法被滥用的情况下更是如此 (过客) 大哥string keyword = "2004";string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";Regex reg = new Regex(@"(?:^|>)[^<>]*(?:<|$)");string result = reg.Replace(test, delegate(Match m) { return m.Value.Replace(keyword, "<font color='red'>" + keyword + "</font>"); });Response.Write(result);这种方式是不是在ASP.NET 1.1 下不行呢? 都什么年代了,还在用.NET 1.1啊有些年头不用了,记得好像是.NET 1.1中的正则不支持匿名方法string keyword = "2004";private string regReplace(Match m){ return m.Value.Replace(keyword, "<font color='red'>" + keyword + "</font>");}//调用string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";Regex reg = new Regex(@"(?:^|>)[^<>]*(?:<|$)");string result = reg.Replace(test, new MatchEvaluator(regReplace)); 现在还有一个问题 就是如果连接是这样的话 有问题string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\"><<2004年三季度工作总结会议报告>></a></li>";也就是标题包含了<< >>这些符号 又或或者“<”“>”这样的符号在标题里,能不能,<a>只处理这里的内容</a>,只处理超连接标题的内容 正则替换一下,其它不变Regex reg = new Regex(@"(?isn)(?<=<a\b[^>]*>)((?!</?a\b).)*(?=</a>)"); 编码问题 复合控件不能任意移动位置? AccessDataSource如何引用web.config中的数据库链接? treeview如何在客户端取得id 请问谁有asp.net C# 写的下载系统源码,知道我再追加给分 用什么办法实现发布前的预览功能? 在线等... 易者不难,难者不易。散分! 迷惑的博客开发 为什么获取控件值获取不了?? 请问datagrid中分页怎么实现?急! js取RadioButton的值 siteMap的URL中如何加入动态的参数
//搜索关键词高亮显示函数
public static string HighLightKeyWord(string pain,string keyword)
{ //搜索关键词高亮函数By JN 2006.11.30
System.Text.RegularExpressions.MatchCollection m = Regex.Matches(pain, keyword, RegexOptions.IgnoreCase);
//忽略大小写搜索字符串中的关键字
for (int j = 0; j < m.Count; j++)//循环在匹配的子串前后插东东
{
//j×31为插入html标签使pain字符串增加的长度:
pain = pain.Insert((m[j].Index + keyword.Length + j * 31), "</font>");//关键字后插入html标签
pain = pain.Insert((m[j].Index + j * 31), "<font color=#ff0000>");//关键字前插入html标签
} //搜索关键词高亮函数By JN 2006.11.30
return pain;
}第二个是JS 的解决办法
http://hi.baidu.com/yisqiu/blog/item/f8be5c60359c3fdf8db10da7.html
http://www.blogjava.net/faithwind/archive/2007/06/26/126387.html
http://topic.csdn.net/u/20091028/13/df7cd47d-0f30-4361-9695-a6aa547b8d7a.html
闻着内容而至不知道楼主要在前台处理,还是在后台处理//后台C#处理方法
string keyword = "2004";
string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";
Regex reg = new Regex(@"(?:^|>)[^<>]*(?:<|$)");
string result = reg.Replace(test, delegate(Match m) { return m.Value.Replace(keyword, "<font color='red'>" + keyword + "</font>"); });
Response.Write(result);//前台javascript处理方法
<script type="text/javascript">
var keyword = "2004";
var str ="<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";
var re = /(?:^|>)[^<>]*(?:<|$)/g;
str = str.replace(re, function($0)
{
return $0.replace(keyword, "<font color='red'>" + keyword + "</font>");
});
document.write(str);
</script>
我对其它方式不是很了解,但如果楼主对效率要求较高,而要处理的内容很规范的话,可以考虑XML或xpath等方式处理,会比正则效率高XML等方式优势在于处理效率高,局限性在于对格式要求严格,处理不了格式不规范的内容
正则表达式优势在于通用,能处理不规范的内容,但由此而牺牲了一定的性能,尤其是在对正则不了解,语法被滥用的情况下更是如此
string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";
Regex reg = new Regex(@"(?:^|>)[^<>]*(?:<|$)");
string result = reg.Replace(test, delegate(Match m) { return m.Value.Replace(keyword, "<font color='red'>" + keyword + "</font>"); });
Response.Write(result);这种方式是不是在ASP.NET 1.1 下不行呢?
都什么年代了,还在用.NET 1.1啊有些年头不用了,记得好像是.NET 1.1中的正则不支持匿名方法
string keyword = "2004";
private string regReplace(Match m)
{
return m.Value.Replace(keyword, "<font color='red'>" + keyword + "</font>");
}
//调用
string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li>";
Regex reg = new Regex(@"(?:^|>)[^<>]*(?:<|$)");
string result = reg.Replace(test, new MatchEvaluator(regReplace));
string test = "<li><a href=\"/news/20041025114305.htm\">华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\">d华北院召开2004年三季度工作总结会议</a></li><li><a href=\"/news/20041025114305.htm\"><<2004年三季度工作总结会议报告>></a></li>";
也就是标题包含了<< >>这些符号
正则替换一下,其它不变
Regex reg = new Regex(@"(?isn)(?<=<a\b[^>]*>)((?!</?a\b).)*(?=</a>)");