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

时间:2016-01-11 08:36:25

标签: javascript regex mediawiki

我想从wiki字符串中删除所有文件,如下所示:

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

但文件可以包含wiki链接,如何删除所有可以包含wiki链接的文件?我已经使用了这个正则表达式/\[\[File:[^\]]+\]\]/但是这对包含wiki链接的文件不起作用,请注意我不想删除其他地方的wiki链接。

3 个答案:

答案 0 :(得分:1)

如果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]]
    • 的字符串
    • [^[\]]* - 除[]以外的零个或多个字符
  • ]] - 文字序列]]

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

文件标题可以(并且,在维基百科上,有时也可以)包含嵌套括号,包括其他文件。您可以将平衡括号与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