ここでは、動的正規表現を構築する上でベースの別のアプローチは、です:正規表現の両端の\b
アンカーは任意の単語の一部をwikifyしようとしているから、このバージョンを防ぐ
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)
が、あなたが望むなら、この制限を緩和することができます。最後wikifiedワード(JSFiddle)の終わりにs
又はes
サフィックスを可能にする
var re = new RegExp('\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g');
たとえば、正規表現を用いて構成を置き換えます。 MediaWikiは、ページが表示されたときにリンクテキストの一部として自動的にそのような接尾辞を含むことに注意してください。
編集:ここではMediaWikiのページタイトルがあるようにも、各フレーズの最初の文字は大文字と小文字を区別しないことを可能にするバージョンがあります。また、多少のUnicodeフレンドリーなソリューションと\b
アンカーを置き換えます
JavaScriptは大文字と小文字を区別しないセクションなどの標準的なPCREの機能をサポートする正規表現場合、これははるかに少ない乱雑になり
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)、ルック・バックまたはUnicode文字クラス。特に
、これらの欠けている機能の最後に、でも、この解決策はまだ完全 Unicode対応でないため:特に、それはリンクが後に開始または句読点が含まれて\W
に一致する任意の文字、前に終了することができますすべてのASCII以外の文字、さらには文字も含まれます。 (しかし、ASCII以外の文字内のリンクは正しく処理されます)。実際には、これは大きな問題ではないと私は考えています。
私は本質的に、他の2つの文字列の間にない場合に限り、別の文字列内の文字列を置き換えることができるかどうかを尋ねています。 (例えば、 'str2'が文字列' str3'と 'str4'の間にない場合にのみ、文字列' str2'の中の文字列 'str1'を置き換えます)。 –
これは ''この関数が返すはずです 'これは[出力]として[[テキスト]]から[[wikify]]になりますか? – kieran
Javascriptの正規表現でlookahead演算子とlookbehind演算子を使用してこれを行うことは可能かもしれませんが、私は正規表現の構文に慣れていません。 –