And*_*een 5 javascript regex mediawiki
现在,我正在尝试创建一个脚本,自动创建指向Wiki文档中其他页面的链接.
function createLinks(startingSymbol, endingSymbol, text, links){
//this needs to be implemented somehow - replace every match of the list of links with a link
}
createLinks("[[", "]]", "This is the text to wikify", ["wikify", "text"]);
//this function would return "This is the [[text]] to [[wikify]]" as its output.
Run Code Online (Sandbox Code Playgroud)
最明显的解决方案是简单地替换字符串的每一场比赛text有[[text]],但我会碰到一些问题-例如,如果我试图wikify字符串"some problems"和"problems"字符串"一些问题"中,我将结束与字符串"[[some [[problems]]]]".有没有办法解决这个问题?
这是另一种基于动态构建正则表达式的方法:
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 );
}
Run Code Online (Sandbox Code Playgroud)
(JSFiddle)
正则表达式两端的锚点\b阻止此版本尝试将任何部分单词维基化,但如果您愿意,您可以放宽此限制。例如,将正则表达式构造替换为:
var re = new RegExp( '\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g' );
Run Code Online (Sandbox Code Playgroud)
允许在最后一个维基化单词(JSFiddles )的末尾添加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 );
}
Run Code Online (Sandbox Code Playgroud)
(JSFiddle)
如果 JavaScript 正则表达式支持诸如不区分大小写的部分、后视或 Unicode 字符类等标准 PCRE 功能,那么事情就会变得不那么混乱。
特别是,由于最后一个缺失的功能,即使这个解决方案仍然不完全支持 Unicode:特别是,它允许链接在任何匹配的字符之后开始或结束\W,其中包括标点符号,但也包括所有非 ASCII 字符,甚至字母。(但是,链接内的非 ASCII 字母可以正确处理。)实际上,我认为这不应该是一个主要问题。