यहाँ, एक और तरीका है गतिशील रूप से एक regexp के निर्माण पर आधारित,
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)
regexp के दोनों सिरों पर \b
एंकर किसी भी आंशिक शब्द wikify की कोशिश कर रहा से इस संस्करण को रोकने लेकिन यदि आप चाहें तो आप इस प्रतिबंध को आराम कर सकते हैं। उदाहरण के लिए, साथ regexp निर्माण की जगह:
var re = new RegExp('\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g');
पिछले wikified शब्द (JSFiddle) के अंत में एक s
या es
प्रत्यय की अनुमति होगी। ध्यान दें कि पृष्ठ प्रदर्शित होने पर लिंक टेक्स्ट के हिस्से के रूप में मीडियाविकि में स्वचालित रूप से ऐसे प्रत्यय शामिल होते हैं।
संपादित करें: यहाँ एक संस्करण है कि भी मीडियाविकि पृष्ठ शीर्षक की तरह प्रत्येक वाक्यांश के पहले अक्षर केस-संवेदी होने की अनुमति देता है। यह भी एक से थोड़ा अधिक यूनिकोड के अनुकूल समाधान के साथ \b
एंकर की जगह:
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)
यह अगर जावास्क्रिप्ट समर्थित केस-संवेदी वर्गों के रूप में इस तरह के मानक PCRE सुविधाओं regexps बहुत कम गंदा हो सकता है, लुक-बैक या यूनिकोड कैरेक्टर क्लासेस।
विशेष रूप से, कारण इन लापता सुविधाओं के अंतिम करने के लिए, यहां तक कि इस समाधान अभी भी नहीं पूरी तरह से यूनिकोड-बारे में पता है: विशेष रूप से, यह लिंक के बाद शुरू हो या जो विराम चिह्न शामिल किसी भी चरित्र है कि \W
से मेल खाता है, इससे पहले कि समाप्त करने के लिए अनुमति देता है लेकिन सभी गैर-ASCII वर्ण, यहां तक कि पत्र भी। (हालांकि, गैर-ASCII अक्षरों लिंक के अंदर सही तरीके से संभाला जाता है।) प्रैक्टिस में, मुझे नहीं लगता कि यह एक प्रमुख मुद्दा होना चाहिए।
मैं अनिवार्य रूप से पूछ रहा हूं कि किसी स्ट्रिंग को किसी अन्य स्ट्रिंग के अंदर प्रतिस्थापित करना संभव है, यदि केवल और यदि यह दो अन्य तारों के बीच नहीं है। (ई जी।, स्ट्रिंग 'str1' स्ट्रिंग 'str2' के अंदर स्ट्रिंग' str1' को प्रतिस्थापित करें, अगर और केवल तभी 'स्ट्र 2' स्ट्रिंग्स 'str3' और' str4') के बीच नहीं है। –
पढ़ना चाहिए कि यह // // यह फ़ंक्शन वापस आ जाएगा "यह [[text]] [[wikify]]" के आउटपुट के रूप में है? – kieran
यह जावास्क्रिप्ट नियमित अभिव्यक्ति में लुकहेड और ऑपरेटरों को देखकर ऐसा करना संभव हो सकता है, लेकिन मैं नियमित अभिव्यक्ति वाक्यविन्यास से बहुत परिचित नहीं हूं। –