2016-10-26 25 views
0

我有一个文本,并且我希望当用户搜索一个术语时,通过用标记标记包装术语来突出显示该术语。用正则表达式标记字符串中的文本,但排除链接

JavaScript来包裹匹配项:

var sampleText = window.document.getElementById('test').innerHTML; 
var _keywordHighlight = function (text, term) { 
    var pattern = new RegExp('('+term+')', 'gi'); 
    text = text.replace(pattern, '<mark>$1</mark>');; 
    return text; 
}; 

var newText = _keywordHighlight(sampleText, 'sample'); 
window.document.getElementById('test').innerHTML = newText; 

jsfiddle.net链接:

https://jsfiddle.net/homa/j0Lgk6pf/

的问题是,该网址内搜索词也被标记标签包装就坏了链接。

如何排除要用标记包裹的链接?

+0

尝试'VAR模式=新的正则表达式;'和'与 ' $&''取代。另请参阅http://stackoverflow.com/questions/18621568/regex-replace-text-outside-html-tags –

回答

2

使用负向前视来添加一个附加约束,该术语在没有首先具有<时不会跟随>。这将有效地排除< ...>标记内的匹配项。

var pattern = new RegExp('('+term+')(?![^<]*>)', 'gi'); 

https://jsfiddle.net/qdk80o0k/

0
  1. 你reinverting轮
  2. 使用innerHTML会破坏事件
  3. 使用innerHTML将触发的DOM

再生为了变薄方便你应该使用现有的插件。这里有很多jQuery插件,但是因为你还没有添加jquery标签,我假设你正在寻找一个普通的JS解决方案。然后唯一的插件是mark.js。 ( '?!([^>] *>)' 一词+, 'GI')

Example of your use case

相关问题