如何突出显示x次出现
如何仅在纯JS中突出显示来自一组文本的匹配的有限子集,以便每个匹配仅出现x个高亮显示 .
var matches = new Array('fox', 'dog');
var MaxHighlights = 2;
原创内容
快速的棕色狐狸跳过懒狗,但懒狗很快就 grab 了棕色的狐狸 . 一般来说,狐狸与狗不是很好的匹配 .
突出显示的内容
快速的棕色 fox 跳过懒惰的 dog 但懒惰的 dog 很快就能 grab 棕色 fox . 一般来说,狐狸与狗不是很好的匹配 .
对于额外的积分,我最好只突出每个句子一个匹配 .
首选突出显示的内容
快速的棕色 fox 跳过懒惰的 dog 但懒惰的狗很快就 grab 了棕色的狐狸 . 一般来说 fox 与 dog 不是很好的匹配 .
我正在使用它是我突出显示尝试的基础http://www.the-art-of-web.com/javascript/search-highlight
2 回答
我的解决方案使用replace()和word-boundaries模式和global modifier g .
replace is, that a callback function can be passed as replacement 的优点 . 我希望你喜欢它,发现它非常有趣,因为JS还没有做太多 . 所以纠正任何错误,如果你找到请:)
回调函数将返回突出显示的匹配作为替换,直到达到限制 .
输出:
EDIT :现在我明白了,还有额外的积分......
这有点挑战性,我希望它在大多数情况下都能正常工作 . 确定:句子是什么并不是那么简单?好吧,我决定,简单地将分割序列视为可定义的标点符号(var
sep_punct
),然后是一个或多个白色空格,如果前面有一个大写字母或数字 .输出:
我有一段时间没有做过JavaScript,所以这段代码可能看起来很生气:
Output:
解释
正则表达式
Words regex: 我们使用
.join('|')
来连接数组元素,因此对于此示例 . 我们的正则表达式看起来像\\b(?:fox|dog)\\b
. 我们使用\b
确保仅匹配fox
而不是firefox
. 需要双重逃逸 . 当然,将g
修饰符设置为"replace all" .Sentence regex: 好吧,让我们分开吧:
[\\s\\S]*?
:匹配任何不合理的零次或多次 .(?:[.?!]|$)
:匹配.
,?
,!
或行尾 .g
修饰符:匹配全部 .突出显示功能:
我们的想法是创建一个数组来记住我们对某些单词的匹配程度 . 因此,在我们的案例中运行以下代码时:
我们有一个看起来像这样的数组:
然后我们匹配我们的单词,并使用函数作为回调来检查我们匹配了多少以及是否应该突出显示 .
首选突出显示功能:
我们基本上,首先匹配每个句子然后我们替换单词(在每个句子中) . 这里的话也有一个限制 .
在线演示
References:
Difference between using var and not using var in JavaScript
How do you pass a variable to a Regular Expression JavaScript?
[C] How many times will strlen() be called in this for loop?