Tools 是非官方社区Wiki。社区文档正在编写中,欢迎参与。 Wiki编辑答疑群:717421103
版本250722.2
全站通知:

帮助:解析函数/replace

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

#replace是一个解析函数。帮助:解析函数页列出了所有解析函数的说明。

#replace

文本替换。出自扩展 ParserFunctions

语法

{{#replace: 字符串 | 搜索项 | 替换项 | 替换次数 }}

  • 字符串:要进行替换操作的原始文本,区分大小写
  • 搜索项(可选):要查找的文本,默认为空格
  • 替换项(可选):替换后的文本,默认为空字符串(即删除匹配项)
  • 替换次数(可选):最大替换次数,默认为无限制

搜索项和替换项的最大长度受系统配置限制,扩展默认值是1000

参数首尾的空格会被移除,参数中的扩展标签也会被移除。如需在参数首尾使用空格,需要配合<nowiki/>标签使用,如<nowiki/> balabala<nowiki/> <nowiki/>

示例

  • {{#replace:Hello world|world|Wiki}} → Hello Wiki
  • {{#replace:Banana|a|o}} → Bonono
  • {{#replace:No_spaces_here|_|<nowiki> </nowiki>}} → Nospaceshere
  • {{#replace:No_spaces_here|_|<nowiki>-</nowiki>}} → Nospaceshere
  • {{#replace:No_spaces_here|_|<nowiki/> <nowiki/>}} → No spaces here(由于nowiki和其他扩展标签会被移除,只能使用自闭合的nowiki标签防止空格被移除)
  • {{#replace:Remove all spaces}} → Removeallspaces

底层代码

来自MediaWiki及其扩展的源代码,运行在服务端。此处仅供快速查阅,便于更充分的挖掘其“特性”。

/** mediawiki-1.37.0\extensions\ParserFunctions\includes\ParserFunctions.php
 * {{#replace:string | from | to | limit }}
 *
 * Replaces each occurrence of "from" in "string" with "to".
 * At most "limit" replacements are performed.
 *
 * Note: Armored against replacements that would generate huge strings.
 * Note: If "from" is an empty string, single space is used instead.
 *
 * @param Parser $parser
 * @param string $inStr
 * @param string $inReplaceFrom
 * @param string $inReplaceTo
 * @param int $inLimit
 * @return mixed|string
 */
public static function runReplace( Parser $parser, $inStr = '',
		$inReplaceFrom = '', $inReplaceTo = '', $inLimit = -1 ) {
	global $wgPFStringLengthLimit;

	$inStr = $parser->killMarkers( (string)$inStr );
	$inReplaceFrom = $parser->killMarkers( (string)$inReplaceFrom );
	$inReplaceTo = $parser->killMarkers( (string)$inReplaceTo );

	if ( !self::checkLength( $inStr ) ||
		!self::checkLength( $inReplaceFrom ) ||
		!self::checkLength( $inReplaceTo ) ) {
		return self::tooLongError();
	}

	if ( $inReplaceFrom === '' ) {
		$inReplaceFrom = ' ';
	}

	// Precompute limit to avoid generating enormous string:
	$diff = mb_strlen( $inReplaceTo ) - mb_strlen( $inReplaceFrom );
	if ( $diff > 0 ) {
		$limit = ( ( $wgPFStringLengthLimit - mb_strlen( $inStr ) ) / $diff ) + 1;
	} else {
		$limit = -1;
	}

	$inLimit = (int)$inLimit;
	if ( $inLimit >= 0 ) {
		if ( $limit > $inLimit || $limit == -1 ) {
			$limit = $inLimit;
		}
	}

	// Use regex to allow limit and handle UTF-8 correctly.
	$inReplaceFrom = preg_quote( $inReplaceFrom, '/' );
	$inReplaceTo = StringUtils::escapeRegexReplacement( $inReplaceTo );

	$result = preg_replace( '/' . $inReplaceFrom . '/u',
					$inReplaceTo, $inStr, $limit );

	if ( !self::checkLength( $result ) ) {
		return self::tooLongError();
	}

	return $result;
}
代码逻辑:
  • 参数处理:移除解析标记(Strip marker);空搜索项自动转换为单个空格
  • 检测输入参数长度在限制内,否则报错;计算搜索项和替换项长度,计算长度限制内允许的最大替换次数
  • 使用正则表达式实施替换(preg_replace
  • 检测结果保证长度在限制内
  • 返回结果

实际用例

一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考
碧蓝航线 - blhx

原神 - ys

明日方舟 - arknights

恋与深空 - lysk

崩坏:星穹铁道 - sr

赛马娘 - umamusume

坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险 - gt

黑神话:悟空 - wukong

WIKI实验室 - tools

地下城堡2 - dxcb2

东方归言录 - touhoulostword

赛尔计划 - seerplan

幻塔 - ht

绝区零 - zzz

公主连结 - pcr

无期迷途 - wqmt

奇迹暖暖 - qjnn

赛尔号 - seer

地下城堡3 - dxcb3

千年之旅 - elf

戴森球计划 - dsp

梦幻模拟战 - langrisser

StardewValley星露谷物语 - stardewvalley

赛尔号星球大战 - seerwar

方舟指令 - fzzl

偶像荣耀/idoly pride - idolypride

深空之眼 - dhmmr

克鲁赛德战记 - cq

天地劫 - tdj

江南百景图 - jiangnan

阴阳师妖怪屋 - yysygw

缺氧 - oni

武林外传ol - wulinonline

灵魂潮汐 - lhcx