2014-04-01 55 views
1

我已經在Javascript以下字符串:我有一些Javascript來突出顯示該字符串的匹配單詞的陣列的份數(基於搜索來自用戶的輸入)高亮一個串內匹配的單詞

Smith, Dan 

。因此,如果用戶鍵入「史密斯d」,那麼我的陣列和預期產出將包括:

string = "Smith, Dan" 
word[0] = "smith" 
word[1] = "d" 
output: <em>Smith</em>, <em>D</em>an 

然而,當第二個字包含在第一字中,這屬於過去。因此,例如,如果字符串「史密斯,海倫」,那麼會發生以下情況:

string = "Smith, Helen" 
word[0] = "smith" 
word[1] = "h" 
output: <em>Smit<em>h</em></em>, <em>H</em>elen 

我使用正則表達式做替換,因爲沒有保持原文的情況下相同的要求(因此,如果用戶鍵入「史密斯」,我仍然得到「史密斯」返回)。

這裏是我的代碼:

var output = "Smith, Helen"; 
var arText = new Array(); 
arText[0] = "smith"; 
arText[1] = "h"; 
for (var iw = 0; iw < arText.length; iw++) { 
    var term = arText[iw]; 
    var re = new RegExp('(' + term + ')', 'gi'); 
    output = output.replace(re, '<em>$1</em>'); 
} 

任何人都可以提出,使其忽略的話這已經是EM標籤內我如何修改呢?我對上面的代碼所需的輸出是:

<em>Smith</em>, <em>H</em>elen 

回答

0

它看起來像您的搜索涉及字邊界。我不知道所有的邊緣情況,但是對現有代碼的補充確實會返回您所尋求的輸出。只要搜索涉及換行符,它也應該適用。

var output = "Smith, Helen"; 
var arText = new Array(); 

arText[0] = "smith"; 
arText[1] = "h"; 

for (var iw = 0; iw < arText.length; iw++) { 
    var term = arText[iw]; 
    var re = new RegExp('(\\b' + term + ')', 'gi'); 
    output = output.replace(re, '<em>$1</em>'); 
}// notice the \\b which means look for term by line break. double escape for string. 

OUTPUT

"<em>Smith</em>, <em>H</em>elen" 

另一個更復雜的例子

var output = "Smith, Helen butter"; 
var arText = new Array(); 

arText[0] = "smith"; 
arText[1] = "h"; 
arText[2] = "bu"; 

for (var iw = 0; iw < arText.length; iw++) { 
    var term = arText[iw]; 
    var re = new RegExp('(\\b' + term + ')', 'gi'); 
    output = output.replace(re, '<em>$1</em>'); 
} 

OUTPUT

"<em>Smith</em>, <em>H</em>elen <em>bu</em>tter"