如何从 wiki 字符串中删除所有文件?

How to remove all files from wiki string?

我想像这样从 wiki 字符串中删除所有文件:

[[File:Edvac.jpg|thumb|[[EDVAC]], one of the first stored-program computers]]

但是文件可以包含 wiki link,我怎样才能删除所有可以包含 wiki link 的文件?我已经使用了这个正则表达式 /\[\[File:[^\]]+\]\]/ 但这不适用于包含 wiki link 的文件,请注意我不想删除其他地方的 wiki links。

如果wiki链接里面没有嵌套链接,可以使用

\[\[File:[^[\]]*(?:\[\[[^[\]]*]][^[\]]*)*]]

regex demo

var re = /\[\[File:[^[\]]*(?:\[\[[^[\]]*]][^[\]]*)*]]/g; 
var str = 'Some [[File:Edvac.jpg|thumb|[[EDVAC]], one of the first stored-program computers]] text [[File:Edvac.jpg|thumb|text here]]';
var result = str.replace(re, "");
document.body.innerHTML = result;

解释:

  • \[\[File: - 文字序列 [[File:
  • [^[\]]* - []
  • 以外的零个或多个字符
  • (?:\[\[[^[\]]*]][^[\]]*)* - 零个或多个序列:
    • \[\[[^[\]]*]] - [[text without [ and ] inside]]
    • 类型的字符串
    • [^[\]]* - []
    • 以外的零个或多个字符
  • ]] - 文字序列 ]]

另一个简短的变体是:\[\[File:[^[\]\]]*(\[\[.*]])?[^[\]\]]*]]。但最好包括检查 file:, Image:, image:, Media:media: 因为它们也被用于 Commons 的媒体嵌入的许多文章中:

str.replace(/\[\[(file|image|media):[^[\]\]]*(\[\[.*]])?[^[\]\]]*]]/gi, '')

文件标题可以(在维基百科上,有时确实如此)包含嵌套括号,包括其他文件。您可以将平衡括号与 recursive regexp 匹配

|
  \[\[File:                         # literal [[File:
    (?P<balanced>                   # subpattern for []-balanced content
      (?>[^\[\]]*)                  # zero or more non-bracket chars 
                                    # (with once-only subpattern for efficiency)
      (?:                           # then a (possibly empty) sequence of...

        \[(?&balanced)\]            # []-balanced content in brackets
        (?>[^\[\]]*)                # followed by zero or more non-bracket chars
      )*
    )
  \]\]                              # literal ]]
|x                                  # extended mode flag (ignores whitespace)

(regex101) 尽管您可能不想这样做。 (此外,文件标题很可能包含不平衡的括号。)

如果您对 Python 感到满意,您应该尝试使用 mwparserfromhell,它具有强大的解析器并可以为您识别文件引用。类似于

import mwparserfromhell

def has_file_prefix(link):
    return str(link.title).strip().startswith('File:')

text = 'I am a wiki page. I contain some images like [[File:Edvac.jpg|thumb|[[EDVAC]], one of the first stored-program computers [[File:Edvac2.jpg| [[nesting|nested]] file with random <nowiki>[[</nowiki> in caption ]] ]] [[ not a file ]] and lots of text.'

wikicode = mwparserfromhell.parse(text)
for file in wikicode.ifilter_wikilinks(matches=has_file_prefix):
    try:
       wikicode.remove(file)
    except ValueError:
       pass # probably tried to remove a nested file when the parent was already removed

print wikicode