大段文本的多个关键字高亮

前几天看到有人提在网页中实时高亮关键字,大约6万多个字中高亮600个关键字,用户可以随时修改并及时高亮,也就是onkeyup时做高亮,说用正则在IE下效率不理想

想了下自已给了一个实现方案:
比如这段文本是:"这是一大段文本,一大段文本哦"
关键字是:["这是","大段文本","哦"]
首先找出最长的关键字,并把这些关键字弄成map,如:

var keys = [‘这是‘, ‘这里是‘, ‘文本‘, ‘一‘];

var prepareKeys = function() {
    if (!prepareKeys.$map) {
        var map = {};
        var maxLength = 0;
        for (var i = 0; i < keys.length; i++) {
            map[keys[i]] = 1;
            maxLength = Math.max(keys[i].length, maxLength);
        }
        prepareKeys.$map = {
            map: map,
            cache: {},
            length: maxLength
        }
    }
    return prepareKeys.$map;
}

接下来在大段文本中,从开始位置截取按最长关键字的长度截取一段

则截取后的字符串是:"这是一大",那么剩下的字符串为: "段文本,一大段文本哦"

接下来比较 "这是一大" 是否为关键字,如果是关键字,则着色并继续按上述规则截取剩余的字符串

如果"这是一大"不是关键字,则从后面截掉一个字,并把这个字追加到剩余的字符串开始位置

则"这是一大"变成"这是一" 剩余字符串为:"大段文本,一大段文本哦"

然后再比较"这是一"是否为关键字,直到为空

然后再从剩余的字符串中按上述规则继续截取

最终代码如下

var input = ‘这是一大段文本,这是一大段文本‘;
var keys = [‘这是‘, ‘这里是‘, ‘文本‘, ‘一‘];

var prepareKeys = function() {
    if (!prepareKeys.$map) {
        var map = {};
        var maxLength = 0;
        for (var i = 0; i < keys.length; i++) {
            map[keys[i]] = 1;
            maxLength = Math.max(keys[i].length, maxLength);
        }
        prepareKeys.$map = {
            map: map,
            cache: {},
            length: maxLength
        }
    }
    return prepareKeys.$map;
}

var colorKeyword = function(str) {
    var info = prepareKeys();
    var output = [];
    while (str) {
        var sub = str.substring(0, info.length);
        var oSub = sub;
        if (info.cache[sub]) {
            console.log(‘cache:‘, sub);
            output.push(str.charAt(0));
            str = str.substring(1);
        } else {
            str = str.substring(info.length);
            while (!info.map[sub] && sub) {
                str = sub.charAt(sub.length - 1) + str;
                sub = sub.slice(0, -1);
            }
            if (sub) {
                output.push(‘<‘, sub, ‘>‘);
            } else {
                info.cache[oSub] = 1;
                output.push(str.charAt(0));
                str = str.substring(1);
            }
        }
    }
    return output.join(‘‘);
}
colorKeyword(input);

宣传下我的区块管理框架Magix:https://github.com/thx/magix

欢迎试用Magix、star与fork

原文地址:https://www.cnblogs.com/jlfw/p/12620171.html

时间: 2024-08-11 23:51:14

大段文本的多个关键字高亮的相关文章

JDBC学习笔记(8):访问大段文本数据

数据库准备: 1 create table clob_test 2 ( 3 id integer not null auto_increment, 4 big_text text not null, 5 primary key(id) 6 ); 将大段文本添加进数据库: 1 public static void create() throws SQLException, IOException { 2 Connection conn = null; 3 PreparedStatement ps

用jdbc访问大段文本数据

1 package it.cast.jdbc; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileNotFoundException; 7 import java.io.FileReader; 8 import java.io.FileWriter; 9 import java.io.IOException; 10 impo

交互设计:隐藏或显示大段文本的UI组件有哪些?

应用场景: 在手机上要给列表中的每一项添加一个大段的介绍,应该用什么UI组件 A: 这里可以用,模态对话框,弹出提示,工具提示这类组件.模态对话框的好处,就是用关闭的按钮,用户操作方便:而弹出提示和工具提示只能通过点击来切换 模态对话框: http://v2.bootcss.com/javascript.html#modals http://www.runoob.com/bootstrap/bootstrap-modal-plugin.html Bootstrap 模态框(Modal)插件 模态

Html大段文本自适应换行显示-SSM

只处理前端: <style> .ctl{ table-layout:fixed } .ctl td{ word-break:break-all } </style> <div> <table cellSpacing="0" cellpadding="1" width="100%" class="ctl" border=1> <tBody> <tr><

JDBC学习笔记:用JDBC处理大段数据

1.数据库——创建数据表 1 create table clob_test 2 ( 3 id integer not null auto_increment primary key, 4 big_text text not null 5 ); 2.用JDBC处理大段文本数据 (1)将文本数据写入数据库 1 @Test 2 public void create() throws SQLException, IOException { 3 Connection conn = null; 4 Prep

在 Angular 中实现搜索关键字高亮

在 Angular 中,我们不应该试图直接修改 DOM 的内容,当需要更新 DOM 内容的时候,应该修改的其实是我们的数据模型,也就是 $scope 中的数据,Angular 会帮助我们将修改之后的数据展示在页面中. 但是,在有些情况下,比如我们有一个搜索框,希望将搜索的关键字在正文中高亮出来,这时候就会感觉比较吃力了,filter 可以帮助我们处理这种情况. 实际上,很多时候,我们的数据是不能直接输出到 DOM 中的,典型的比如日期,或者货币等等,通常需要将我们内部的数据格式化之后,再输出到页

label中的关键字高亮

一 .在初始化方法中把所有需要高亮关键字的label加入到labels数组中,并且把这些label原来字体的颜色加入到 labelTextColors中 ,代码如下 self.labels = [NSArray arrayWithObjects:self.textLabel,self.detailTextLabel, nil]; self.labelTextColors = [NSArray arrayWithObjects:kColor_Black,kColor_LightGray, nil]

使用&lt;pre&gt;标签为你的网页加入大段代码

在上节中介绍加入一行代码的标签为<code>,但是在大多数情况下是需要加入大段代码的,如下图: 怎么办?不会是每一代码都加入一个<code>标签吧,没有这么复杂,这时候就可以使用<pre>标签. 语法: <pre>语言代码段</pre> <pre> 标签的主要作用:预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符. 如下代码: <pre> var message="欢迎"; for(

如何用正则匹配这段文本

"<p style="text-align:center;">1 您不用压货,零库存,我们为您一件代发.2 本公司以批发为主,利润低薄,量大从优 .3 本厂鞋子自主生产,不打标不贴牌4 退换货7天退15天换,要求:(1)不影响二次销售.(2)不收过季产品5 气味.色差.配饰易掉.不明显处的胶渍.肉眼在1.5米以外不能明显分辨的划痕或不影响穿着的小瑕疵,不属于质量问题,鞋子都是才从工厂加工出来,部分鞋子肯定有轻微的味道,放在通风处一两天就消失了.每个人用的显示器不一