這裏的另一種方法,基於動態生成的正則表達式:
function wikifyText (startString, endString, text, list) {
list = list.map(function (str) {
return str.replace(/([^a-z0-9_])/g, '\\$1');
});
list.sort();
list.reverse();
var re = new RegExp('\\b(' + list.join('|') + ')\\b', 'g');
return text.replace(re, startString + '$1' + endString);
}
(JSFiddle)
的\b
錨在正則表達式的兩端防止這個版本從試圖wikify任何部分單詞,但如果你想要的話,你可以放鬆這個限制。例如,對於正則表達式替換結構:
var re = new RegExp('\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g');
將允許在最後wikified字(JSFiddle)的端部的s
或es
後綴。請注意,當頁面顯示時,MediaWiki會自動包含這些後綴作爲鏈接文本的一部分。
編輯:這裏有一個版本,也允許每個詞的第一個字母是區分大小寫的,比如鏈接到MediaWiki頁面標題是。它也取代了\b
錨有稍微的Unicode友好的解決方案:
function wikifyText (startString, endString, text, list) {
list = list.map(function (str) {
var first = str.charAt(0);
str = first.toUpperCase() + first.toLowerCase() + str.substr(1);
str = str.replace(/(\W)/ig, '\\$1');
return str.replace(/^(\\?.\\?.)/, '[$1]');
});
list.sort();
list.reverse();
var re = new RegExp('(^|\\W)(' + list.join('|') + ')(?=(e?s)?\\W)', 'g');
return text.replace(re, '$1' + startString + '$2' + endString);
}
(JSFiddle)
如果JavaScript的正則表達式支持這樣的標準PCRE特點不區分大小寫的部分這將是少了很多凌亂,後面還是Unicode字符類。
特別是,由於過去的這些缺失的功能,即使這個解決方案仍然沒有完全支持Unicode的:尤其是,它允許鏈接後開始或匹配\W
任何字符,包括標點符號之前結束還包括所有非ASCII字符,甚至字母。 (但是,裏面的非ASCII字母鏈接處理正確。)實際上,我認爲這不應該是一個主要問題。
我基本上問是否可以替換另一個字符串中的字符串,當且僅當它不在兩個其他字符串之間時。 (例如,當且僅當'str2'不在字符串'str3'和'str4'之間時,替換字符串'str2'內的字符串'str1')。 –
應該讀取'//此函數將返回「這是[[文本]] [[wikify]]」作爲其輸出「? – kieran
在Javascript正則表達式中使用lookahead和lookbehind操作符可能會這樣做,但我對正則表達式語法不是很熟悉。 –