【问题标题】:How to remove all files from wiki string?如何从 wiki 字符串中删除所有文件?
【发布时间】:2016-01-11 08:36:24
【问题描述】:

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

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

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

【问题讨论】:

  • 第一对[[]]里面可以只有一个链接吗?没有嵌套链接?
  • @stribizhev 最好假设它可以有字符串喜欢[[File:Edvac.jpg|thumb|[[EDVAC]], one of the [[first]] stored-program [[computers]]]]
  • 请检查我的答案是否按预期工作,我现在不明白这里应该删除什么。据我所知,wiki 链接中没有嵌套的 wiki 链接。

标签: javascript regex mediawiki


【解决方案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]] 类型的字符串
    • [^[\]]* - 除了[] 之外的零个或多个字符
  • ]] - 文字序列]]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是javascript问题。
      • 其实不是。在其上添加 javascript 标记并不能替代阐明您的要求,这可能是绝对的,也可能不是绝对的。 javascript 中没有好的 wikitext 解析器(除非您将 node.js 视为 javascript);有时得到错误的结果对您的用例来说可能是问题,也可能不是问题。您可能能够部署服务器端处理并通过 AJAX 等进行交互。如果您没有在问题中解释这些细节,请不要指望人们会读懂它们。
      猜你喜欢
      • 2010-11-04
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2018-03-04
      • 2012-06-04
      相关资源
      最近更新 更多