Javascript 如何从字符串中删除所有Wiki模板?
我有维基百科文章的内容,内容如下:Javascript 如何从字符串中删除所有Wiki模板?,javascript,regex,mediawiki-templates,Javascript,Regex,Mediawiki Templates,我有维基百科文章的内容,内容如下: {{使用mdy日期|日期=2014年6月} {{Infobox个人 |name=Richard Matthew Stallman |image=richardstallman-Fête de l'Humanité2014-010.jpg |描述=Richard Stallman,2014年 |出生日期={出生日期和年龄| 1953 | 03 | 16} |出生地点=纽约市 |国籍=美国人 |其他名称=RMS,RMS |已知=自由软件运动、GNU、Emacs、G
{{使用mdy日期|日期=2014年6月}
{{Infobox个人
|name=Richard Matthew Stallman
|image=richardstallman-Fête de l'Humanité2014-010.jpg
|描述=Richard Stallman,2014年
|出生日期={出生日期和年龄| 1953 | 03 | 16}
|出生地点=纽约市
|国籍=美国人
|其他名称=RMS,RMS
|已知=自由软件运动、GNU、Emacs、GNU编译器集合| GCC
|母校=哈佛大学,麻省理工学院
占领=自由软件基金会主席
|网站={{URL|https://www.stallman.org/}}
|奖项=麦克阿瑟奖学金
EFF先锋奖
“…见#荣誉和奖项|荣誉和奖项”
}}
或
{{需要引证|日期=2011年5月}
如何删除它?我可以使用这个正则表达式:/\{{[^}]+\}/g
,但它不适用于像Infobox这样的嵌套模板
我曾尝试使用此代码先删除嵌套模板,然后删除信息框,但结果不正确
var input=document.getElementById('input');
input.innerHTML=input.innerHTML.replace(/\{{[^}]+\}}}/g',)代码>
{{使用mdy日期|日期=2014年6月}
{{Infobox个人
|name=Richard Matthew Stallman
|image=richardstallman-Fête de l'Humanité2014-010.jpg
|描述=Richard Stallman,2014年
|出生日期={出生日期和年龄| 1953 | 03 | 16}
|出生地点=纽约市
|国籍=美国人
|其他名称=RMS,RMS
|已知=自由软件运动、GNU、Emacs、GNU编译器集合| GCC
|母校=哈佛大学,麻省理工学院
占领=自由软件基金会主席
|网站={{URL|https://www.stallman.org/}}
|奖项=麦克阿瑟奖学金
EFF先锋奖
“…见#荣誉和奖项|荣誉和奖项”
}}
Javascript正则表达式没有与嵌套括号匹配的功能(如递归或平衡组)。正则表达式的一种方法是使用一种模式对字符串进行多次处理,以找到最里面的括号,直到没有可替换的内容:
do {
var cnt=0;
txt = txt.replace(/{{[^{}]*(?:{(?!{)[^{}]*|}(?!})[^{}]*)*}}/g, function (_) {
cnt++; return '';
});
} while (cnt);
图案详情:
{{
[^{}]* # all that is not a bracket
(?: # this group is only useful if you need to allow single brackets
{(?!{)[^{}]* # an opening bracket not followed by an other opening bracket
| # OR
}(?!})[^{}]* # same thing for closing brackets
)*
}}
如果不想多次处理该字符串,也可以在找到括号时通过增加和减少标记来读取字符串
另一种方法是使用拆分和数组.prototype.reduce
:
var stk = 0;
var result = txt.split(/({{|}})/).reduce(function(c, v) {
if (v == '{{') { stk++; return c; }
if (v == '}}') { stk = stk ? stk-1 : 0; return c; }
return stk ? c : c + v;
});
@yurzui这对包含{{}的文本在多个地方@jcubic不起作用你的意思是不应该匹配foo
?如果你可以分两步完成,你可以先匹配内部,然后匹配外部,这是针对内部的