Jump to content

Extension:Replace Text(替换文本)

From mediawiki.org
This page is a translated version of the page Extension:Replace Text and the translation is 98% complete.
MediaWiki扩展手册
ReplaceText
发行状态: 稳定版
实现 特殊页面
描述 为管理员提供一个用于替换整个wiki的页面内容和标题的字符串的表单
作者 Yaron Koren <yaron57@gmail.com> 和 Niklas Laxström
最新版本 1.8
兼容性政策 快照跟随MediaWiki发布。 master分支不向后兼容。
MediaWiki 1.31+
  • $wgReplaceTextResultsLimit
  • replacetext
许可证 GNU General Public License 2.0 or later
下載
前往translatewiki.net翻譯Replace Text扩展
問題 开启的任务 · 报告错误

替换文本是MediaWiki的一个扩展功能,它提供了一个特殊页面及命令行脚本,使管理员能够对wiki内容页面的文本和标题执行服务器端的全局字符串查找与替换操作。

替换文本操作是一项延迟操作,加入作业队列。 您可以在maintenance文件夹中运行runJobs.php,以立即执行替换并处理作业队列。

安裝

此扩展随附于MediaWiki 1.31及更新版本,因此您無需下載它。 但其余的配置的指示仍须依循執行。
  • 下载文件,并解压ReplaceText文件夹到extensions/目录中。
    开发者和代码贡献人员应改从Git安装此扩展,输入:
    cd extensions/
    git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/ReplaceText
    
  • 請新增下列代码到您的LocalSettings.php 文件的底部:
    wfLoadExtension( 'ReplaceText' );
    
  • 默认情况下,只有"sysop "用户组的成员才能使用替换文本功能。 您可以通过修改LocalSettings.php中的$wgGroupPermissions数组来添加或修改允许的用户集合。 例如,若要为“bureaucrat”或“bot”用户添加权限,您需添加以下内容:
    $wgGroupPermissions['bureaucrat']['replacetext'] = true;
    
  • Yes 完成 – 請导航至您的wiki上的Special:Version,以验证此扩展已成功安装。

使用

“替换文本”功能定义了一个位于“Special:ReplaceText”(或其他语言中的对应页面)的特殊页面,用于处理全局搜索和替换操作;同时它还定义了replaceAll.php脚本,可通过命令行实现相同功能。 本文档将首先介绍特殊页面,随后讲解命令行脚本。

页面Special:ReplaceText初始显示一个供管理员填写搜索与替换详情的表单:管理员需输入搜索字符串及其替换内容、指定搜索的命名空间集,并选择是否替换页面内容、页面标题或两者中的文本。 管理员可选择性地添加两个额外筛选条件:所有页面必须归属的分类名称,以及所有页面名称必须以之开头的前缀。 提交此表单后,系统将显示包含该搜索字符串的所有页面列表,或标题包含该搜索字符串的所有页面列表,或同时显示两者。 每个页面名称旁边都有一个复选框,以便用户取消选择不希望被替换的页面。 用户随后可以点击“替换”按钮执行实际替换操作。 文本替换一旦完成便无法直接撤销;不过你总可以执行一次"反向"替换,将新字符串换回原始内容。 因此,若替换字符串为空白或已在wiki中存在,系统将向用户显示警告信息。

如果搜索字符串在页面中出现多次,则每个实例都会被替换。 每个页面的替换操作都会显示为一次(小)wiki编辑,执行文本替换的管理员将显示为编辑者,编辑摘要则呈现为“文字替换:‘搜索字符串’替换为‘替换字符串’”。

页面标题无法移动到wiki中已存在的标题,也无法移动到多行标题。 无法移动的页面将在“选择”页面上直接列出,且旁边不设复选框,以示其不可移动。

搜索区分大小写。 关于如何使其不区分大小写,请参阅下文

使用须知

  1. 默认情况下,ReplaceText 每次仅处理 250 页。 要更改此设置,您可以在 LocalSettings.php 中将 $wgReplaceTextResultsLimit 设置为一个更大的值。 然而,您可能会受到 PHP 的 max_input_vars 限制;如果扩展报告了此类警告,您可能需要更改它。
  2. 所有替换任务均会被加入作业队列。 因此,若需处理大量页面,您需要先运行“替换文本”功能,随后执行“runJobs.php”操作(可能需要多次重复)。

使用正则表达式

若您使用的是MySQL或PostgreSQL数据库,便能在Special:ReplaceText表单中看到“使用正则表达式”复选框。 此复选框不适用于SQLite数据库,因为SQLite缺少原生的"REGEXP"运算符。

若勾选此复选框,便可在搜索与替换字符串中使用正则表达式。 允许使用的正则表达式集合基本上是PHP及MySQL/PostgreSQL正则表达式功能的一个小子集。 搜索字符串中可使用的特殊字符包括"( ) . * + ? [ ] |",而在替换字符串中则可使用$1、$2等值。 (若要将这些符号作为常规字符使用,只需在它们前面添加"\"进行转义——处理"/"字符时也需采用相同方法。) 本节不会提供关于使用正则表达式的教程(维基百科条目是入门的好选择,此MySQL正则表达式页面亦是如此),但以下是内联说明中列出的基础示例:

搜索字符串 - a(.*)c
替换字符串 - ac$1

这将查找包含字母“a”、字母“c”以及两者之间任意文本(以“.*”表示)的页面。 随后,它会把中间文本放在'a'和'c'之后——替换字符串中的"$1"指的是搜索字符串中被括号括起来的第一个元素(在这个例子中,只有一个这样的元素)。

对于实际调用替换功能的每一页,替换操作会针对搜索字符串的所有出现位置进行,而不仅仅是一次——这与常规的非正则表达式搜索的处理方式相同。

更复杂的正则表达式

搜索字符串 - hello([0-9]*)\.([0-9]*)
替换字符串 - $1,$2

这将以"222,555"和"hello2.55" with "2,55"替换"hello222.555"

首先匹配的是“hello”。 括号内是用于搜索任意数字“0-9”的表达式。 接下来的星号可匹配前一个元素的多个实例。 括号和星号被括号包围,因此我们匹配完整边界并将其传输到$1。 "\."表明这是一个真正的点号,而非特殊字符。 括号内的第二个表达式被匹配并存入$2。

替换内容后接数字

以下方法不会奏效:

搜索字符串 - 123(.*)456
替换字符串 - $1123456

这是因为搜索会认为替换的数字是1123456,而不是1。 相反,你应当这样做:

替换字符串 - {$1}123456

通常,您可以将编号值用大括号括起来。

不区分大小写搜索

要使搜索不区分大小写,请使用正则表达式及不区分大小写修饰符 (?i)

搜索字符串 - (?i)iphone
替换字符串 - iPhone

以上操作将把所有提及iPhone/iphone/IPHONE的大小写统一为iPhone。

时间戳的封装

若文本中包含时间戳(例如视频转录文本),其格式为hh:mm:ss,其中hhmm未补零,且hh:可能不存在——例如:

0:03
Blah blah blah
11:21
Blah blah blah
2:31:54
Blah blah blah

并且您可能希望将时间戳封装在,例如,span标签中。 你可以这样做:

  • 原始文本: ((([01]?\d|2[0-3]):)?[0-5]?\d:[0-5]\d)
  • 替换文本: <span class="timespan">$0</span>

结果为:

<span class="timespan">0:03</span>
Blah blah blah
<span class="timespan">11:21</span>
Blah blah blah
<span class="timespan">2:31:54</span>
Blah blah blah

(特别鸣谢:https://matrix.to/#/@alex.mashin:matrix.org)

命令行脚本:replaceAll.php

extensions/ReplaceText/maintenance目录下,Replace Text提供了一个名为replaceAll.php的脚本,可通过命令行运行,其功能与页面Special:ReplaceText执行的所有替换操作完全相同。 该脚本的前两个参数应为搜索文本和替换文本;您可参照以下方式简单调用:

php replaceAll.php "Leningrad" "St. Petersburg"

如果在替换字符串中使用像$1这样的数字值,您必须用双引号将其转义,如"ac\$1",或者使用单引号。 否则,Shell 会误以为它们是变量,从而用空白字符替换它们。

此脚本的其他可能参数/标志为:

描述 默认
--dry-run 仅查找搜索文本,不进行任何实际替换
--regex 应使用正则表达式 false
--user 将替换归于用户 ID为1的用户
--yes 跳过所有默认“是”的提示
--summary 为替换编辑设置自定义编辑摘要
--rename 重命名页面标题而非替换内容
--bot-edit 将所有替换标记为机器人编辑
--ns 设置要搜索的命名空间的逗号分隔列表
--nsall 在所有命名空间中进行搜索;覆盖为“--ns”设置的任何值。
--replacements 保存制表符分隔替换列表的文件名
--debug 显示正在进行的替换
--category 仅在此分类内搜索页面
--prefix 仅搜索名称以此字符串开头的页面

此外,还有两个标志专门用于打印与具体文本替换无关的辅助信息:

描述 默认
--show-file-format 显示与--replacements配合使用的文件格式描述
--listns 显示此维基上的所有命名空间列表

(您也可以通过调用“php replaceAll.php --help”来查看所有这些选项。)

分配替换至用户

默认情况下,页面历史记录中所有替换内容的贡献者均为发起替换操作的用户。 然而,您可以通过在LocalSettings.php文件中添加如下代码行(位于包含Replace Text的代码行下方),将替换操作记入预设用户——例如机器人账户:

$wgReplaceTextUser = "MyReplaceTextBot";

指定的用户名必须是维基上已存在的账户。 它将被添加到MediaWiki的用户名数组中,该数组中的用户名可能无法注册或登录。

作者

Replace Text was mostly written by Yaron Koren, reachable at yaron57@gmail.com. Important contributions were also made by Niklas Laxström, Ankit Garg (who contributed much of the regular expression code), Mark Hershberger (who wrote the command-line script), Brent Laabs, Cindy Cicalese, Nikhil Kumar, Umherirrender, James Forrester, Fomafix, Marijn van Wezel, Sahaj Khandelwal and others.

版本历史

替换文本目前版本为1.8。 See the entire version history .

截图

以下是“替换文本”工作流程的图像展示。 首先,在Discourse DB的[1]页面上,初始页面中分别输入“George F. Will”作为目标字符串和“George Will”作为替换字符串,并指定同时替换页面标题中的文本。

注意:勾选“全选”和“取消全选”复选框仅在使用Vector皮肤或基于该皮肤的衍生版本时可见。

用户点击“继续”后,页面显示效果如下:

点击“替换”将替换所有列出页面中的此值,同时将末尾的页面移至其新值。

已知问题

  • 替换操作本身以MediaWiki“作业”的形式构建,以确保当用户希望同时执行多项操作时系统不会过载。 这意味着大量替换操作不会立即完成,可能需要数分钟、数小时甚至更长时间才能全部生效。 通常情况下,每次在维基上查看页面时,作业都会被激活;为了加快(或减慢)这一过程,您可以调整每次查看页面时运行的作业数量;默认值为1。 因此,如果维基上的前端活动不足以超越其他新批处理作业的来源,替换文本请求可能在启动后不久就会停滞。 要了解如何更改默认设置,请参阅$wgJobRunRate 页面。 要强制wiki立即执行所有作业,请进入命令行界面并运行脚本runJobs.php ;通常无法通过wiki前端完成此操作。
  • 例如,要让任务在较少使用的维基上运行,比如一个小型业余项目团队的工作维基,你可以强制刷新“所有页面”特殊页面。这可以通过在Unix系统上使用以下shell脚本来实现:
#!/bin/bash
# $0 代表脚本名称,$1 是第一个参数,$2 是第二个参数……
ITERATIONS=$1
WAIT=$2

n=1
while [ $n -le $ITERATIONS ]
do
	echo "Iteration $n/$ITERATIONS"
	# 获取需要重新生成的特殊页面会强制运行维基的队列任务,最终下载结果将被丢弃。
	wget -nv --output-document=/dev/null http://yourwiki.tld/index.php/Special:AllPages
	echo "  wget OK"
	sleep $WAIT
	echo "  wait OK"
	n=$(( n+1 ))
done
  • 如果您在运行替换文本任务时仍遇到问题,将以下内容添加到LocalSettings.php或许能解决问题:
$wgRunJobsAsync = false;
  • 若要在页面移动时不创建重定向(即取消勾选“将旧标题另存为新标题的重定向”复选框),您需要授予相关用户“suppressredirect”权限。 假设您已将replacetext权限授予trusted-editor用户组,则需在LocalSettings.php中添加以下内容:
$wgGroupPermissions['trusted-editor']['suppressredirect'] = true;
  • 若您的修订版本已压缩(即LocalSettings.php 中的$wgCompressRevisions 已启用,或脚本compressOld.php 已通过-t gzip选项执行),则ReplaceText功能将失效,因其依赖的SQL查询无法检索压缩文本内容。 (此时可考虑使用 MassEditRegex 扩展作为替代方案。)
  • 若替换操作数量庞大,部分可能无法完成;或您可能看到提示“至少需选择一个命名空间”的错误信息。 两种情况均源于PHP对表单输入数量的限制。 这一问题可通过多种方式解决:
    • 如果您的服务器上安装了 Suhosin PHP 扩展,这可能是问题的根源。 您可以增加变量suhosin.post.max_varssuhosin.request.max_vars的值;或者在进行替换时尝试暂时禁用Suhosin。
    • PHP设置max_input_vars(自PHP 5.3.9起可用)也会影响您在任何时候可以进行的替换次数——您可以尝试将其设置为一个非常大的数字,例如3,000。

翻译

文本替换的翻译已通过translatewiki.net完成。 该扩展的翻译位于translatewiki。 要添加语言值或更改现有值,您需要在translatewiki.net上创建一个账户,然后在此页面向管理员申请翻译特定语言的权限(流程非常简单)。 一旦获得特定语言的权限,您便可登录并自由添加或编辑该语言的任意信息。

参阅