分类: 代码2010-02-28 13:44 1574人阅读 评论(3) 收藏 举报

一、问题的产生

  搜索结果高亮显示,在新闻标题,来源之类的地方好做,只需要用str.Replace(keyword,"<font style=/"color:red;/"" + keyword +"</font>");这样的方法就可实现。

  问题在于,在新闻内容里做搜索。其中html标签里可能含有关键字,用上面这种方法,将会替换掉html标签的部分内容,导致新闻内容不能正常显示。

  例如:新闻内容里的图片<img alt="" src="Upload/1.jpg" />,搜索时使用的关键字为oa,则会将新闻内容中这张图片替换为<img alt="" src="Upl<font style="color:red;">oa</font>d/1.jpg" />,这张图片就显示不出来了。

二、实现原理

首先,将新闻内容里的所有html标签读出来,保存起来;

其次,将所有html标签替换为一般不可能出现的字符,如[[1]],[[2]]......[[N]]]等;(搜索的关键字一般不会是[[N]]吧,新闻内容里也一般不会出现这样的字符)

再次,将搜索结果替换为高亮显示状态;

最后,将html标签还原。

三、实现代码

以下代码是网上搜集的,来源不详,在此对作者表示感谢。

public static string Reg(string input, string replace)
        {
            //设置高亮样式
            string replaceformat = "<span style=/"font-size:14px; font-weight:bold; color:#f00; {0}</span>";
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(String.Format("{0}", replace), System.Text.RegularExpressions.RegexOptions.Multiline);
            return reg.Replace(input, string.Format(replaceformat, replace));
        }

/// <summary>
        /// 设置各个html部分为自定义标号
        /// </summary>
        /// <param name="input">输入内容</param>
        /// <param name="matches">匹配集合</param>
        /// <returns>替换的字串</returns>
        public static string protectHtml(string input, ref System.Text.RegularExpressions.MatchCollection matches)
        {
            //匹配html的正则
            System.Text.RegularExpressions.Regex htmlReg =
                new System.Text.RegularExpressions.Regex(@"/<.*?/>", System.Text.RegularExpressions.RegexOptions.Multiline);
            //获取匹配集合
            matches = htmlReg.Matches(input);
            //设置替换字串
            string markFormat = "[[{0}]]";
            //替换html,记录位置
            for (int i = 0; i < matches.Count; i++)
            {
                input = input.Replace(matches[i].Value, string.Format(markFormat, i));
            }
            return input;
        }

/// <summary>
        /// 将标号恢复html
        /// </summary>
        /// <param name="input">高亮设置好的字串</param>
        /// <param name="matches">匹配集合</param>
        /// <returns>最终字串</returns>
        public static string restoreHtml(string input, System.Text.RegularExpressions.MatchCollection matches)
        {
            //设置替换字串
            string markFormat = "[[{0}]]";
            for (int i = 0; i < matches.Count; i++)
            {
                input = input.Replace(string.Format(markFormat, i), matches[i].Value);
            }
            return input;
        }

使用方法:

System.Text.RegularExpressions.MatchCollection matches = null;
        string temp = protectHtml(Contents, ref matches);//保护html标签
        temp = Reg(temp, KeyWords);//替换关键字为高亮显示
        Contents = restoreHtml(temp, matches);//恢复html标签

搜索结果高亮显示(不改变html标签)的更多相关文章

  1. Html 改变原有标签属性

    内容简要: 当标签内内容 达到某以条件的时候改变当前标签属性 例如原标签为<tr> 当tr内的值符合某一条件时把<tr>变成<a>标签 例:当订单状体编程已支付的时 ...

  2. asp实现关键词不区分大小写搜索并高亮显示

    用ASP做搜索很容易,但要实现智能搜索这类就比较累一点,其实任何程序都差不多,主要还是看数据库的处理能力,一般小网站ASP经常跟ACCESS数据库搭配,在这种配置下我们要实现关键词不区分大小写搜索并高 ...

  3. DEDE的搜索页面支持arclist和channelartlist标签的操作方法

    很多朋友在使用dedecms进行网站开发时都会存在这样的问题,那就是dedecms的搜索页(search.php)与我们网站页面的模板的头 部.底部不一样,并且还不支持在搜索页调用其他某一栏目的文档. ...

  4. spring data solr 搜索关键字高亮显示

    spring data solr 搜索关键字高亮显示 public Map<String, Object> highSearch(Map searchMap) { Map map = ne ...

  5. 在HTML中改变input标签中的内容

    在HTML中改变input标签的内容 1.使用js自带的方法: document.getElementById('roadName').value='武汉路';//通过标签选择器来选择标签,然后设置值 ...

  6. Angularjs^1.2.9 搜索关键字高亮显示

    需求分析: 根据关键字搜索网页内容,并且高亮显示内容中的关键字细节分析: 1.每次执行搜索操作,需清空上一次结果 2.需区分html标签和正常文本内容,否则为关键字添加样式以后会出现标签内容被显示的情 ...

  7. javascript 搜索并高亮显示

    2015年12月22日 15:45:08 星期二 情景: 用来筛选列表中的数据, 由于单条数据很简短, 没有用php+mysql去实现筛选功能, 只用javascript进行筛选, 匹配的高亮, 或者 ...

  8. jQuery的如何捕捉回车键,改变事件标签

    我希望有一个jQuery的解决方案,我必须接近,有什么需要做的? $('html').bind('keypress', function(e) { if(e.keyCode == 13) { retu ...

  9. dedecms搜索模板,使用{dede:list}标签调用自定义字段不显示(空白)

    前几天使用织梦做一个搜索功能,正常使用{dede:list}调用自定义内容模型中的自定义字段,代码如下:(自定义字段的调用可以参考:http://www.dede58.com/a/dedejq/523 ...

随机推荐

  1. 【练习】数据移动---parfile导出表中指定行:

    要求: ①创建存放数据的文件: ②使用默认的bad文件生成方式: ③使用truncate选项方式. 1.准备条件: [oracle@host03 ~]$ mkdir datadump [oracle@ ...

  2. Oracle10G 连接11G数据库,出现ORA -1017用户名/口令无效; 登录被拒绝 的问题

    一.出现症状 1.使用sqlplus连接正常 2.C#使用10g的ODP.NET连接时,报上面的错误 二.原因 1.Oracle11G之前密码是不区分大小写的,从11G开始默认密码区分大小写 2.使用 ...

  3. NandFlash读写

    1.NandFlash分类 根据物理结构上的区别,NandFlash主要分为如下两类:•SLC (Single Level Cell): 单层式存储•MLC (Multi Level Cell): 多 ...

  4. 浅谈session/cookie

    Session 和Cookie是常用的Web跟踪技术.Cookie保存在客户端,而Session则保存在服务器端,二者结合使用来跟踪用户的会话状态,是http协议的一种扩展技术.之所以说是一种扩展技术 ...

  5. shell_基础知识

    参考: http://blog.csdn.net/kaizi318/article/details/9343551 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告 ...

  6. 多媒体(3):基于WindowsAPI的视频捕捉卡操作

    目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(3):基于WindowsAP ...

  7. dubbo properties

    DUBBO配置项的优先级: java -D优先于 Spring配置,Spring配置优先于 properties文件的配置,这也符合一般项目的规则. 覆盖策略: JVM启动-D参数优先,这样可以使用户 ...

  8. HDU 3065 病毒侵袭持续中(AC自动机)

    这题数据太水,一开始没有加上Get的方法也能AC..话说AC自动机中一定要注意加上Get的方法!(不然,同一个后缀的其他单词就没被算上了.) 代码如下: #include <stdio.h> ...

  9. CodeForces 675C Money Transfers(贪心+奥义维护)

    题意:n个银行. 其中存款有+有-. 总和为0. n个银行两两相邻((1,n),(1,2)...(n-1,n)); 问最少移动几次(只能相邻移动)能把所有数变为0. 分析:思路很简单,起始答案算它为n ...

  10. Windows 窗体设计器中的设计时错误

    当修改窗体里面某一项时导致窗体报错,但是编译运行没问题,报"依赖项问题"则只需要把报错的那个依赖项删除后再重新引用.