正規表現を動的に構築することに基づく別のアプローチを次に示します。
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
正規表現の両端にあるアンカーは、このバージョンが部分的な単語をウィキ化しようとするのを防ぎますが、必要に応じてこの制限を緩和できます。たとえば、正規表現の構成を次のように置き換えます。
var re = new RegExp( '\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g' );
ウィキ化された最後の単語 ( JSFiddle )の末尾にs
or接尾辞を付けることができます。MediaWiki は、ページが表示されるときに、リンク テキストの一部としてそのような接尾辞を自動的に含めることに注意してください。es
編集:これは、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 正規表現が、大文字と小文字を区別しないセクション、後読み、または Unicode 文字クラスなどの標準の PCRE 機能をサポートしていれば、これはずっと面倒ではありません。
特に、これらの欠落している最後の機能のために、このソリューションでさえまだ完全に\W
Unicode 対応ではありません: 特に、句読点だけでなくすべての非 ASCII 文字を含む に一致する任意の文字の後または前でリンクを開始または終了することができます。、文字さえ。(ただし、リンク内の非 ASCII 文字は正しく処理されます。) 実際には、これが大きな問題になるとは思いません。