如何从字符串中删除所有Wiki模板

How to remove all Wiki templates from a string?

本文关键字:Wiki 模板 删除 字符串      更新时间:2023-09-26

我有维基百科文章的内容,内容如下:

{{Use mdy dates|date=June 2014}}
{{Infobox person
| name        = Richard Matthew Stallman
| image       = Richard Stallman - Fête de l'Humanité 2014 - 010.jpg
| caption     = Richard Stallman, 2014
| birth_date  = {{Birth date and age|1953|03|16}}
| birth_place = New York City
| nationality = American
| other_names = RMS, rms
| known_for   = Free software movement, GNU, Emacs, GNU Compiler Collection|GCC
| alma_mater  = Harvard University,<br />Massachusetts Institute of Technology
| occupation  = President of the Free Software Foundation
| website     = {{URL|https://www.stallman.org/}}
| awards      =  MacArthur Fellowship<br />EFF Pioneer Award<br />''... see #Honors and awards|Honors and awards''
}}

{{Citation needed|date=May 2011}}

如何移除?我可以使用这个正则表达式:/'{'{[^}]+'}'}/g,但它不适用于像Infobox 这样的嵌套模板

我试着用这段代码先删除嵌套模板,然后再删除Infobox,但我得到了错误的结果。

var input = document.getElementById('input');
input.innerHTML = input.innerHTML.replace(/'{'{[^}]+'}'}/g, '');
<pre id="input">    {{Use mdy dates|date=June 2014}}
    {{Infobox person
    | name        = Richard Matthew Stallman
    | image       =Richard Stallman - Fête de l'Humanité 2014 - 010.jpg
    | caption     = Richard Stallman, 2014
    | birth_date  = {{Birth date and age|1953|03|16}}
    | birth_place = New York City
    | nationality = American
    | other_names = RMS, rms
    | known_for   = Free software movement, GNU, Emacs, GNU Compiler Collection|GCC
    | alma_mater  = Harvard University,<br />Massachusetts Institute of Technology
    | occupation  = President of the Free Software Foundation
    | website     = {{URL|https://www.stallman.org/}}
    | awards      =  MacArthur Fellowship<br />EFF Pioneer Award<br />''... see #Honors and awards|Honors and awards''
    }}</pre>

Javascript正则表达式没有匹配嵌套方括号的功能(如递归或平衡组)。regex的一种方法是用一种模式多次处理字符串,该模式可以找到最里面的方括号,直到没有什么可替换:

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
)*
}}

如果不想多次处理字符串,也可以在找到方括号时逐个字符地读取字符串,增加和减少标志。

使用split和Array.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;
});