2016-01-10 2 views
1

У меня есть содержание статьи Википедии, которые имеют такие вещи, как это:Как удалить все шаблоны Wiki из строки?

{{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>

+1

@yurzui это не будет работать для текста, которые содержат {{}} в более чем одном месте https://regex101.com/r/kG7bO0/2 – jcubic

+0

@jcubic Вы имеете в виду, что 'foo' не следует сопоставлять? – tchelidze

+0

, если вы можете сделать это в два шага, вы можете совместить внутренние сначала с внешними, это для внутренних https://regex101.com/r/pG5sS0/1 –

ответ

3

регулярных выражений 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 
)* 
}} 

Если вы не хотите обрабатывать строки несколько раз, вы также можете прочитать символ строки по символу, увеличивая и уменьшая флаг при обнаружении скобок.

Другим способом, используя раскол и 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; 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^