2016-10-26 24 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

相關問題