如何高亮显示字符串中的某些词

RaymondXie 2008-03-02 07:28:31
大家好,我有一个小问题想请交各位大侠:
我有一个搜索页面,返回的结果是一大串字符串,我需要将关键词高亮显示出来。

比如说,我的输入字串是(我随便从cnn.com上取了一段做例子)以下一串字符,我的关键词是: Hampton, amendment , Heath

If lawmakers don't take action in the final weeks of the legislative session, the battle will move to the courthouse this spring, said state Rep. Tyrone Brooks, an Atlanta Democrat and civil rights activist leading the officers' campaign.

"I was hoping we wouldn't have to go this route, but litigation appears to be our only option," Brooks said.

Ronald Hampton, executive director of the National Black Police Association, said he knows of no other state with a similar pension situation. "Only Georgia is shameless enough to still have this out there," Hampton said.

The Georgia House has twice passed an amendment resolution but it has gone nowhere in the state Senate. An amendment requires a vote of two-thirds of each chamber as well as approval by voters.

"We can't fix everything for everybody," said state Sen. Bill Heath, chairman of the Senate Retirement Committee.

Heath, a Republican, argued that making retroactive changes to retirement benefits "opens up a can of worms and could destroy the pension system."

我想得到的字串是:

...Ronald Hampton, executive director of the National Black Police Association, said he knows of no other state with a similar pension situation. "Only Georgia is shameless enough to still have this out there," Hampton said. ...An amendment requires a vote of two-thirds of each chamber as well as approval by voters.....

"We can't fix everything for everybody," said state Sen. Bill Heath, chairman of the Senate Retirement Committee.

Heath, a Republican, argued that making retroactive....

各位请注意关键词可以有多个,输入的字串大小不一,最好是所有的关键词都给显示出来。那由于各个关键词在搜索结果中的距离会不一样,所以必须对间隔得远的关键词中间用省略号处理。例外就是最后的返回结果长度最好是可以自由设定,比如说这是一个method,那参数将会是:input, output, keyword[], length

不知各位谁能提供一些好的建议或者最好是有现成的代码,非常感谢。




...全文
479 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
h3cchoc 2011-09-29
  • 打赏
  • 举报
回复
不知道楼主这个功能实现没有?

我现在也需要实现类似功能~~~

uestcpuppy 2011-07-22
  • 打赏
  • 举报
回复
如果需要高亮显示的词比较多,并且对性能有很高的要求
需要使用“多模匹配算法”,这是一种入侵检测系统中
常用的文本匹配算法, 比较成熟的有AC算法, 可以查查
资料
zhaozhao110 2008-03-03
  • 打赏
  • 举报
回复
还是replace啊,为什么不行呢?
private void replace_str(string str,string[] s)
{
.........
}
蝶恋花雨 2008-03-03
  • 打赏
  • 举报
回复
学习下。没做过帮你顶下啊。
蝶恋花雨 2008-03-03
  • 打赏
  • 举报
回复
/*----------------------------------------*\
* 使用 js 标记高亮关键词 by markcxz(markcxz@aol.com)
* 参数说明:
* obj: 对象, 要进行高亮显示的html标签节点.
* hlWords: 字符串, 要进行高亮的关键词词, 使用 竖杠(|)或空格 分隔多个词 .
* cssClass: 字符串, 定义关键词突出显示风格的css伪类.
* 参考资料: javascript HTML DOM 高亮显示页面特定字词 By shawl.qiu
\*----------------------------------------*/
function MarkHighLight(obj,hlWords,cssClass){

hlWords=AnalyzeHighLightWords(hlWords);

if(obj==null || hlWords.length==0)
return;
if(cssClass==null)
cssClass="highlight";
MarkHighLightCore(obj,hlWords);

//------------执行高亮标记的核心方法----------------------------
function MarkHighLightCore(obj,keyWords){
var re=new RegExp(keyWords, "i");

for(var i=0; i<obj.childNodes.length; i++){

var childObj=obj.childNodes[i];
if(childObj.nodeType==3){
if(childObj.data.search(re)==-1)continue;
var reResult=new RegExp("("+keyWords+")", "gi");
var objResult=document.createElement("span");
objResult.innerHTML=childObj.data.replace(reResult,"<span class='"+cssClass+"'>$1</span>");
if(childObj.data==objResult.childNodes[0].innerHTML) continue;
obj.replaceChild(objResult,childObj);
}else if(childObj.nodeType==1){
MarkHighLightCore(childObj,keyWords);
}
}
}

//----------分析关键词----------------------
function AnalyzeHighLightWords(hlWords)
{
if(hlWords==null) return "";
hlWords=hlWords.replace(/\s+/g,"|").replace(/\|+/g,"|");
hlWords=hlWords.replace(/(^\|*)|(\|*$)/g, "");

if(hlWords.length==0) return "";
var wordsArr=hlWords.split("|");

if(wordsArr.length>1){
var resultArr=BubbleSort(wordsArr);
var result="";
for(var i=0;i<resultArr.length;i++){
result=result+"|"+resultArr[i];
}
return result.replace(/(^\|*)|(\|*$)/g, "");

}else{
return hlWords;
}
}

//-----利用冒泡排序法把长的关键词放前面-----
function BubbleSort(arr){
var temp, exchange;
for(var i=0;i<arr.length;i++){
exchange=false;
for(var j=arr.length-2;j>=i;j--){
if((arr[j+1].length)>(arr[j]).length){
temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp;
exchange=true;
}
}
if(!exchange)break;
}
return arr;
}

}
演示地址http://www.cnblogs.com/Files/cncxz/MarkHighLight_Demo.htm
蝶恋花雨 2008-03-03
  • 打赏
  • 举报
回复
http://www.cnblogs.com/cncxz/archive/2007/07/15/818508.html使用 javascript 标记高亮关键词 刚找到。你
可以参考下
RaymondXie 2008-03-02
  • 打赏
  • 举报
回复
多谢关注。我想有些朋友没有注意到真正的要求所在:

替换关键词简单得很,可是如何将输入的长字符串抽取其中的关键字(而且是多个关键字),这些关键字还可能处于不同的位置,位置可远可近,如果太远了,不可以将中间所有不需要的字符串显示出来,而是要用省略号代替。

这是不是一道需要动些脑子的题目?
lvjie717 2008-03-02
  • 打赏
  • 举报
回复
4楼正解
春天的气息 2008-03-02
  • 打赏
  • 举报
回复
得到大字符串后,查查用替换的方式高亮显示关键字了,
如果关键字很,建议设立关键字库,高亮显示效果设置、超链接设置
zhanghaoyue 2008-03-02
  • 打赏
  • 举报
回复
replace("关键字","<font color=red>关建字</font>")
octverve 2008-03-02
  • 打赏
  • 举报
回复
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>单个关键词的处理</title>
<style type="text/css">
<!--
.adKeyword {
color: #FF0000;
}
-->
</style>
</head>
<body>
<p>  一个和尚挑水吃、两个和尚抬水吃、三个和尚没水吃。总寺的方丈大人得知情况后,就派来了一名主持和一名书记,共同负责解决这一问题。主持上任后,发现问题的关键是管理不到位,于是就招聘一些和尚成立了寺庙管理部来制定分工流程。为了更好地借鉴国外的先进经验,寺庙选派唐僧等领导干部出国学习取经;此外,他们还专门花钱请了天主教、基督教的神父传授MBA。神父呆了不久留下几个东东就走了,一个叫BPR,一个叫ERP。</p>
<p> </p>
<p>  书记也没闲着,他认为问题的关键在于人才没有充分利用、寺庙文化没有建设好,于是就成立了人力资源部和寺庙工会等等,并认认真真地走起了竞聘上岗和定岗定编的过场。</p>
<p> </p>
<p>  寺院特意购买了几个计算机系统,包括挑水统计系统、烧香统计系统、普通香客捐款分析系统、大香客捐款分析系统、挨上必死系统(简称IBS系统)、马上就死系统(简称MS系统)等,同时成立香火钱管理部、香火钱出账部、打井策略研究部、打井建设部、打井维护部等等。由于各个系统出来的数总不准确、都不一致,于是又成立了技术开发中心,负责各个系统的维护、二次开发。由于部门太多、办公场地不足,寺院专门成立了综合部来解决这一问题,最后决定把寺院整个变成办公区,香客烧香只许在山门外烧。 </p>
<p> </p>
<p>  部门多、当官的多档和开会自然就多,为了减少文山会海,综合办牵头召开了N次关于减少开会的会,并下达了“关于减少档的档”。同时,为了精简机构、提高效率,寺院还成立了精简机构办公室、机构改革研究部等部门。 </p>
<p> </p>
<p>  一切似乎都合情合理,但香火钱和喝水的问题还是迟迟不能解决。问题在哪呢?有的和尚提出来每月应该开一次分析会,于是经营分析部就应运而生了。分析需要很多数据和报表,可系统总是做不到,于是每个部门都指派了一些和尚手工统计、填写报表、给系统打工。</p>
<p> </p>
<p>  寺院空前地热闹起来,有的和尚在拼命挑水、有的和尚在拼命念经、有的和尚在拼命协调、有的和尚在拼命分析……忙来忙去,水还是不够喝、香火钱还是不够用。什么原因呢?这个和尚说流程不顺、那个和尚说任务分解不合理,这个和尚说部门界面不清、那个和尚说考核力度不够。只有三个人最清楚问题之关键所在,那三个人就是最早的那三都甩不掉!”</p>
<p> </p>
<p>  又过了一年,寺院黄了,和尚们也都死了。人们在水井边发现了几具尸体,是累死的;在寺院里发现了几千具尸体,是渴死的。</p>
</body>
</html>
<script language="JavaScript" type="text/javascript"><!--
if(document.createRange){
var range = document.createRange();
}else
var range = document.body.createTextRange();
if(range.findText){
while(range.findText("和尚")){
range.pasteHTML(range.text.fontcolor("#ff0000"));
range.collapse(true);
}
}else{
var s,n;
s = window.getSelection();
while(window.find("和尚")){

var n = document.createElement("SPAN");
n.style.color="#ff0000"
s.getRangeAt(0).surroundContents(n);
}
}
//--></script>
ccaakkee 2008-03-02
  • 打赏
  • 举报
回复
关注 帮顶
huangbie 2008-03-02
  • 打赏
  • 举报
回复
up
文名: Hacking Vim 原名: Hacking Vim 别名: A cookbook to get the most out of the latest Vim editor 作者: Kim Schulz资源格式: PDF 版本: 文字版 出版社: Packt Publishing书号: 9781847190932发行时间: 2007年 地区: 美国 语言: 英文 简介: 内容简介: 不知道是谁 说过一句话:说世界上的程序员分为三种,一种是使用VIM的,还有一种使用Emacs的,剩下的都是第三种。由此可见VIM的强大程度,可以说,这是一款非常适合程序员使用的编辑器。VIM的设计哲学是如果你的工作只需要做一次,那没问题,怎么搞都行,如果你的工作是要重复的完成某些工作,则IVIM总可以帮你找到更少的按键方式来实现相同的目标,为此,VIM设计了多种模式,常见的模式包括命令模式,编辑模式,命令模式等,这个也是和其他编辑器一个很不相同的地方,可能有些已经有其他编辑器习惯的人有点不太习惯的地方,但是如果将模式熟悉了就可以发现在不同的模式之间切换是很平常的事情,而且带来的好处是更少的按键和更快的输入。 VIM是VI的优秀后裔,虽然VI的后裔不仅仅包括VIM,但是VIM是实现对VI的兼容性最好的编辑器,其他的后裔还包括STEVIE, ELvis, NVi, Vile等。除了实现对VI的兼容性外,VIM还扩展了很多的功能,包括语法高亮,代码折迭,脚本扩展等等,Packt Publishing出版社出版的这本书《Hacking VIM》就对VIM使用的一些TIP作了介绍,介绍的内容包括定制篇,移动篇,效率篇,格式篇和脚本篇,希望可以给你在使用VIM的过程带去一点帮助。 目录: *---注:该版本为英文版,以下仅为文的提要而已,切勿以为是文版,特此注明! 提纲 1.引言 2.常用技巧 2.1全局替换 2.2多文件替换 2.3增加多行注释 2.4 ab技巧 2.5分割窗口功能 2.6改变颜色配置 2.7显示和不显示行号 2.8更好的状态行 2.9光标行和光标列 2.10语言拼写检查 2.11键绑定 2.12定位功能 2.13 自动补全 2.14 使用宏 2.15读写文件或命令内容 2.16使用寄存器 2.17折迭 2.18文件比较vimdiff 2.19缩进 2.20使用文件模板 2.21识别文字体 3. 常用插件 3.1 ctags 3.2 taglist 3.3 A 3.4 NERDtree 3.5 MiniBuffer 3.6 calendar 1.引言 如果你已经使用Vim超过一年半载,对hjkl,i,a,yy,dd,p,u等命令已经滚瓜烂熟,但是还基本没有自己写过.vimrc文件,又觉得需要将使用Vim的程度提到一个新的高度,看《Hacking Vim》这本书最合适不过了。 我给这本书打4分。觉得很不错是因为这本书提到了许多我原来没有掌握的技巧或命令。没有打5分是因为这其也夹杂着好些没有多大用处的部分,又有一些部分选材不是很精要。比如说,Vim插件部分,我以为一本好的书应该为读者挑选一些最常见也最有用的插件对作者进行介绍。这部分作者似乎还没有SMTH BBS Vim版的FAQ写得好。 2.常用技巧 下面总结一下我从这本书和其它地方学到的一些常见的设置和技巧(我自认为是高级的,可是有些读者可能认为某些部分是初级的)。 2.1全局替换 %s/old/new/g 2.2多文件替换 多文件替换,比如要替换所有.c文件a_value为a_value,可以使用如下方法: vi *.c :argdo %s/a_value/b_value/ge | update 其update是直接替换覆盖原文件,若需要确认,则可使用 :argdo %s/a_value/b_value/gec | update 2.3增加多行注释 方法一: Ctrl+v; 选定所需行; I; #|//; Esc两次 比如需要增加#或者是//这种注释。Ctrl + v 定位到开始行,然后选定需要的行,然后执行 I 命令,然后输入 # 或 //,然后按 Esc键两次,即可把注释操作应用到所有选定的行,记住选定不能使用v指令,而应该使用Ctrl + v (清除注释请参考上面的方法)(v是按行选定,Ctrl + v 是按照列选定) 方法二: :起始行,终止行s/要替换字符/替换为新字符/g 比如::1,20s/^/\/\//g 2.4 ab技巧 :ab 替代符 原始信息 比如::ab mail abc@gmail.com 2.5分割窗口功能 分割窗口: :split [filename] (水平分割) :vsplit [filename] (垂直分割) :new (打开一个窗口编辑新文件) 窗口跳转: CTRL+W w (循环跳转) CTRL+W (h|j|k|l) (上下左右) 关闭(当前)窗口: :close 关闭所有其它窗口: :only 增减窗口大小 CTRL+W +/- 缓冲区跳转: :bnext (下一缓冲区) :blast (上一缓冲区) 退出所有窗口 :qall 保存所有窗口: :wall 保存并退出所有窗口: :wqall 2.6改变颜色配置 :colorscheme mycolors Vim自带多种配色方案,可以根据需要自己选用。若不知道系统有哪些配色方案,可以在输入:colorscheme(空格)后用Shift+Tab键选择。 2.7显示和不显示行号 显示行号:set nu[mber] 取消显示行号:set nonu 2.8更好的状态行 通过设置statusline可以设置更好的状态行,我选择的设置是: set statusline=%F%m%r%h%w\ [FORMAT=%{&ff;}]\ [ASCII=\.3b]\ [POS=%4l,%3v][%p%%]\ [LEN=%L] 它可以显示当前文件的路径和文件名以及整个文件的长度。 2.9光标行和光标列 :set cursorline (设置光标行) :set cursorcolumn (设置光标列) 其我觉得光标行更有用些。Vim默认设置,要找到光标所在位置不是很方便。 2.10语言拼写检查 set spell set spelllang=en,de,it 文需要语言包支持,不过最常用的还是英文检查吧 2.11键绑定 map 对Normal, Insert, Visual和Command-line模式均有效 imap Insert模式有效 cmap Command-line模式有效 nmap Normal模式有效 vmap Visual模式有效 键绑定可以定义一些键的组合为一个快捷键,如: imap :wa 2.12定位功能 { 段首 } 段尾 g, 前一修改处 g; 后一修改处 ( 句首 ) 句尾 w 下一单头 b 前一单头 % 跳至匹配括号 [[ 和 ][ 向后|前至下一区段开始 [] 和 ]] 向后|前至下一区段结束 [{ 跳至块开始 ]} 跳至块结束 [/ 跳至注释块开始 ]/ 跳至注释块结束 gd (Goto Declaration) 跳至定义处 gD 跳至全局变量定义处 gj 跳至长行下一段 gk 跳至长行上一段 gf (Goto File) 打开文件 ?向前查找 / 向后查找 ?? 重复上一向前查找 // 重复上一向后查找 # 向前查找光标下(整匹配) * 向后查找光标下(整匹配) g# 向前查找光标下字符串(不必是整) g* 向后查找光标下字符串(不必是整) vimgrep /pattern/[j][g] file file2 … fileN 多文件查找 使用标志(mark)定位: 0~9 系统自用 a-z 本文件mark (使用方法: 标志:ma, 调至标志 `a) A-Z 跨文件的mark :marks 查看所有标志 :delmarks 删除标志 2.13 自动补全 Ctrl+p 自动补全单 Ctrl+n 自动补全单(向前查找)两者一般感觉不到区别 Ctrl+x Ctrl+k 通过字典补全单 Ctrl+x Ctrl+t 从同义典(thesaurus)补全 Ctrl+x Ctrl+f 文件名自动完成(很有用) Ctrl+x Ctrl+l 自动完成整行 Ctrl+x Ctrl+i 从当前和包含文件补全 Ctrl+x Ctrl+o 全能自动补全,需要set omnifunc 说明: 设置字典的方式:在.vimrc增加以下语句(借用look命令的字典库) set dictionary+=/usr/share/dict/words 即可使用Ctrl+x Ctrl+k功能,很好很强大! 2.14 使用宏 qx (开始录制宏至寄存器x,x可以为任何字母,但是最常见的是q) command1 … q (结束录制) @x (引用宏) @@ (重复上次宏使用) 2.15读写文件或命令内容 :r filename (读入文件内容) :m,nw filename (将m~n行内容写入文件) r!command (插入command命令结果) 2.16使用寄存器 无名寄存器 “” 数字寄存器 “0 “1 … “9 有名寄存器(Named Registers) “a~”z “A~”Z (大写寄存器内容追加,而不是覆盖) 只读寄存器: “% 当前活动缓冲区文件名 “# 前一文件的文件名,替换文件 “. 最后插入的文本 “: 最后命令行运行的命令 黑洞寄存器: “- 进入的永远消失 搜索模式寄存器 “/ 表达式寄存器: “= (使用:输入表达式后ENTER, p粘贴) 2.17折迭 zfa{ 创建折迭 zc 折迭 zo 打开折迭 zM 折迭所有 zR 打开所有折迭 2.18文件比较vimdiff :vimdiff file1 file2 :diffsplit filename 或命令行下 vim –d file1 file2 可进行文件比较 [c 前一差别 ]c 后一差别 2.19缩进 >% 缩进块内容 <% 反缩进块内容 >i{ {内部缩进(不包括{}) >a{ {内容缩进(包括{}) 中内容) 2.21识别文字体 你的Vim在打开文文件时都是乱码吗?若是这样,在.vimrc加入以下几行就可以了: set fileencodings=utf-8,gb2312,gbk,gb18030 set termencoding=utf-8 set encoding=prc 3. 常用插件 Vim的插件有许多,上Vim.org自己查吧,不过我自己使用以下几个,也觉得是用有用的。以下只说明这些插件的用途,具体用法不做详细介绍。有了这些插件,足以形成一个可以与VC媲美的集成开发环境了。 3.1 ctags 实现标签跳转,C/C++/Java编程时很有用。命令行下ctags –R *创立标签,Ctrl+]/Ctrl+O跳转,Ctrl+T返回 3.2 taglist 生成文件纲要,包括函数、关键字等。安装后使用:Tlist 3.3 A 实现头文件跳转。ctags不能查找头文件 3.4 NERDtree 目录浏览功能。可以用o命令打开目录或文件,非常好用 3.5 MiniBuffer 打开多个文件时,生成一个类似标签页的导航菜单,可以用Ctrl+w w命令跳转至该部分并用Tab选择不同文件 3.6 calendar 日历插件 ...

62,054

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧