Extension:Replace Text(替换文本)
发行状态: 稳定版 |
|
|---|---|
| 实现 | 特殊页面 |
| 描述 | 为管理员提供一个用于替换整个wiki的页面内容和标题的字符串的表单 |
| 作者 | Yaron Koren <yaron57 |
| 最新版本 | 1.8 |
| 兼容性政策 | 快照跟随MediaWiki发布。 master分支不向后兼容。 |
| MediaWiki | 1.31+ |
|
|
|
|
| 许可证 | GNU General Public License 2.0 or later |
| 下載 | |
| 前往translatewiki.net翻譯Replace Text扩展 | |
| 問題 | 开启的任务 · 报告错误 |
替换文本是MediaWiki的一个扩展功能,它提供了一个特殊页面及命令行脚本,使管理员能够对wiki内容页面的文本和标题执行服务器端的全局字符串查找与替换操作。
替换文本操作是一项延迟操作,加入作业队列。
您可以在maintenance文件夹中运行runJobs.php,以立即执行替换并处理作业队列。
安裝
- 下载文件,并解压
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;
完成 – 請导航至您的wiki上的Special:Version,以验证此扩展已成功安装。
使用
“替换文本”功能定义了一个位于“Special:ReplaceText”(或其他语言中的对应页面)的特殊页面,用于处理全局搜索和替换操作;同时它还定义了replaceAll.php脚本,可通过命令行实现相同功能。 本文档将首先介绍特殊页面,随后讲解命令行脚本。
页面Special:ReplaceText初始显示一个供管理员填写搜索与替换详情的表单:管理员需输入搜索字符串及其替换内容、指定搜索的命名空间集,并选择是否替换页面内容、页面标题或两者中的文本。 管理员可选择性地添加两个额外筛选条件:所有页面必须归属的分类名称,以及所有页面名称必须以之开头的前缀。 提交此表单后,系统将显示包含该搜索字符串的所有页面列表,或标题包含该搜索字符串的所有页面列表,或同时显示两者。 每个页面名称旁边都有一个复选框,以便用户取消选择不希望被替换的页面。 用户随后可以点击“替换”按钮执行实际替换操作。 文本替换一旦完成便无法直接撤销;不过你总可以执行一次"反向"替换,将新字符串换回原始内容。 因此,若替换字符串为空白或已在wiki中存在,系统将向用户显示警告信息。
如果搜索字符串在页面中出现多次,则每个实例都会被替换。 每个页面的替换操作都会显示为一次(小)wiki编辑,执行文本替换的管理员将显示为编辑者,编辑摘要则呈现为“文字替换:‘搜索字符串’替换为‘替换字符串’”。
页面标题无法移动到wiki中已存在的标题,也无法移动到多行标题。 无法移动的页面将在“选择”页面上直接列出,且旁边不设复选框,以示其不可移动。
搜索区分大小写。 关于如何使其不区分大小写,请参阅下文。
使用须知
- 默认情况下,ReplaceText 每次仅处理 250 页。 要更改此设置,您可以在 LocalSettings.php 中将
$wgReplaceTextResultsLimit设置为一个更大的值。 然而,您可能会受到 PHP 的max_input_vars限制;如果扩展报告了此类警告,您可能需要更改它。 - 所有替换任务均会被加入作业队列。 因此,若需处理大量页面,您需要先运行“替换文本”功能,随后执行“
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,其中hh和mm未补零,且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_vars和suhosin.request.max_vars的值;或者在进行替换时尝试暂时禁用Suhosin。 - PHP设置
max_input_vars(自PHP 5.3.9起可用)也会影响您在任何时候可以进行的替换次数——您可以尝试将其设置为一个非常大的数字,例如3,000。
- 如果您的服务器上安装了 Suhosin PHP 扩展,这可能是问题的根源。 您可以增加变量
翻译
文本替换的翻译已通过translatewiki.net完成。 该扩展的翻译位于translatewiki。 要添加语言值或更改现有值,您需要在translatewiki.net上创建一个账户,然后在此页面向管理员申请翻译特定语言的权限(流程非常简单)。 一旦获得特定语言的权限,您便可登录并自由添加或编辑该语言的任意信息。
参阅
- Extension:MassEditRegex/zh - 使用正则表达式同时编辑多个页面的类似扩展
| 此扩展在以下wiki农场/托管网站和/或软件包中提供: |
- Stable extensions/zh
- Special page extensions/zh
- AdminLinks extensions/zh
- ChangeTagsListActive extensions/zh
- ListDefinedTags extensions/zh
- SpecialMovepageAfterMove extensions/zh
- UserGetReservedNames extensions/zh
- GPL licensed extensions/zh
- Extensions in Wikimedia version control/zh
- All extensions/zh
- Extensions bundled with MediaWiki 1.31/zh
- Extensions included in BlueSpice/zh
- Extensions included in Canasta/zh
- Extensions available as Debian packages/zh
- Extensions included in Miraheze/zh
- Extensions included in MyWikis/zh
- Extensions included in Open CSP/zh
- Extensions included in ProWiki/zh
- Extensions included in semantic::core/zh
- Extensions included in wiki.gg/zh
- Edit extensions/zh
- Page action extensions/zh
- Page renaming extensions/zh
