最近项目遇到一个小需求,就是在一段文字中,高亮几个关键词,例如以下文字:

京东(JD.com)是中国一家自营式B2C购物网站,创始人刘强东担任京东集团CEO。旗下设有京东商城、京东金融、拍拍网、京东智能、O2O及海外事业部。2013年正式获得虚拟运营商牌照。2014年5月,在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD)。2016年6月与沃尔玛达成深度战略合作,1号店并入京东。2017年1月4日,中国银联宣布京东金融旗下支付公司正式成为银联收单成员机构。2017年4月25日,京东集团宣布正式组建京东物流子集团。2017年8月3日,2017年“中国互联网企业100强”榜单发布,京东排名第四位。

需要高亮的关键词:京东商城、京东、京东物流、京东集团

最简单的办法,就是利用正则表达式,像这样:

function addKeyWordHighline(oText,keyWords){
    //oText->一段文字,keyWords->关键词数组
    var returnVal=oText;
    for(var i=0;i<keyWords.length;i++){
        if(keyWords[i]!=''){
            returnVal=returnVal.replace(new RegExp(keyWords[i],"g"),'<span class="highLight">'+keyWords[i]+'</span>');
        }
    }
    return returnVal;
}

但是这样子做,会导致两个问题:
1、“京东物流”“京东集团”无法高亮
2、重复添加高亮标签。关键词“京东”在“京东商城”后面,会导致文字“京东商城”变成

<span class="highLight"><span class="highLight">京东</span>商城</span>

改进思路(分别对应问题1、2):
1、将关键词数组排序,长度较长的排在前面,优先高亮
2、将<span class="highLight">……</span>区域排除。主要利用正则表达式中的元字符?!pattern(正向否定预查)实现。

正向否定预查:在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。

改进后的代码:

function addKeyWordHighline(oText,keyWords){
    var returnVal=oText,i=0,wordReg;
    keyWords.sort(compareWordLength);
    
    for(i=0;i<keyWords.length;i++){
        if(keyWords[i]!=''){
            wordReg=new RegExp('(?!<span+>.[^<]*)'+keyWords[i]+'(?!.[^<]*<\/span>)','g');
            returnVal=returnVal.replace(wordReg,'<span class="highLight">'+keyWords[i]+'</span>');
        }
    }
    return returnVal;
}

function compareWordLength(a,b){
    if(a.length>b.length){
        return -1;
    }else if(a.length<b.length){
        return 1;
    }else{
        return 0;
    }
}

最终效果:

正则:高亮多个相似关键词,如京东、京东物流、京东商城…的更多相关文章

  1. 基于HTML十秒做出淘宝页面

    十分钟做出一个网页,看似不可思议,下面小编给大家带来了基于HTML十秒做出淘宝页面,只分为两步,代码超级简单,需要的朋友参考下吧

  2. 研究下淘宝的swift热点缓存迁移的事

    为了避免被喷激,提前先说下,这篇文章可能更多的是我自己的理解,勿当真.这两天重温了下淘宝叔度的文章,关于淘宝swift热点迁移的事…这时候,可以适当的用小盘的ssd,来充当二层热度的cache缓存层。最热的数据放在内容中,其次的数据是放在ssd闪存里面,最差的缓存cache是放在sata里面。mem,ssd,sata的本身性能,我向大家也都知道,memory>ssd>sata,价格方面是倒过来的…

  3. UIKit框架-基础控件Swift版本: 3.UILabel方法/属性详解

    前面我们讲解了UI基础控件的UIButton,现在让我们继续往下讲:1.UILabel的状态内容的显示模式内容的位置字体样式文字排序2.常用属性:以下就是我们在实际开发中最常用到的UILabel的属性:3.实现代码由于前面已经把如何创建工程介绍了,这里就不多做第二次介绍了,下面让我们直接来看代码:实现方法:最终的效果:没有高亮时的状态高亮时的状态:好了,这次我们就讲到这里,下次我们继续~~

  4. UIKit框架-基础控件Swift版本: 4.UIImageView方法/属性详解

    前面我把UIButton和UILabel的常用属性讲完了,现在让我们来看看第三个基础控件:1.UIImageView的状态图片的展示状态2.UIImageView的常用属性3.常用的方法4.代码实现在viewDedload中实现:最终效果图:这里有几个动画属性暂时不讲先,等到后面的综合使用时再一起说,这里涉及到的UIImage知识点,下一篇文章里会有讲解.好了,这次就讲到这里,下次我们继续~

  5. Swift UIImageView 构造方法

    UIImageView有三个构造方法init我们可能发现UIImageView并没有这个构造方法,其实他是继承父类UIView的方法init(image:UIImage!)这个比较简单直接看代码init(image:UIImage!)苹果开发群:414319235欢迎加入欢迎讨论问题

  6. swift控件之旅之UIButton

    如:然后在方法中可以获得按钮对象了:运行结果:

  7. swift3.0layer折叠 淘宝商品View折叠

  8. JavaScript实现搜索联想关键字高亮功能

    本文将详解如何利用原生js+css+html实现的输入框搜索联想的功能,并集搜索关键字高亮效果,文中的示例代码讲解详细,需要的可以参考一下

  9. Java正则表达式API边界匹配

    这篇文章主要介绍了Java正则表达式API边界匹配,文章围绕主题展开相应的相关资料,具有一定的参考价值,需要的朋友可以参考一下

  10. vue实现搜索关键词高亮的详细教程

    这篇文章主要为大家介绍了vue实现搜索关键词高亮的详细教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部