如何从 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:[^[\]]*(?:\[\[[^[\]]*]][^[\]]*)*]]
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
我想像这样从 wiki 字符串中删除所有文件:
[[File:Edvac.jpg|thumb|[[EDVAC]], one of the first stored-program computers]]
但是文件可以包含 wiki link,我怎样才能删除所有可以包含 wiki link 的文件?我已经使用了这个正则表达式 /\[\[File:[^\]]+\]\]/
但这不适用于包含 wiki link 的文件,请注意我不想删除其他地方的 wiki links。
如果wiki链接里面没有嵌套链接,可以使用
\[\[File:[^[\]]*(?:\[\[[^[\]]*]][^[\]]*)*]]
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