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

帮助:解析函数/switch

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

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

#switch

多分支条件判断函数,根据输入值匹配不同情况返回对应结果。出自扩展 ParserFunctions

语法

{{#switch: 比较值 
| 情况1 = 结果1 
| 情况2 = 结果2 
| ... 
| #default = 默认结果 
}}
  • 比较值:待匹配的字符串或表达式
  • 情况N = 结果N:匹配时返回的结果
  • #default(可选):无匹配时的默认结果
  • 分组语法:连续多个无等号情况共享下一结果,如:{{#switch: 比较值 | 情况1=a | 情况2 | 情况3 | 情况4 = 结果234 }}

示例

基础匹配
{{#switch: baz
| foo = Foooooo
| baz = Bazzzzz
| Bar
}}

Bazzzzz


{{#switch: test 
| foo = Foo 
| #default = 未匹配 
}}

未匹配


{{#switch: test 
| foo = Foo 
| 未匹配 
}}

未匹配


分组结果
{{#switch: cat 
| dog 
| cat 
| wolf = 犬科 
| lion = 猫科 
| 其他 
}}

犬科


数值比较
{{#switch: 02 
| 2 = 数值匹配 
| 02 = 字符匹配 
}}

数值匹配

参数处理
  • {{#switch: {{{1}}} | red = 红色 | blue = {{{1}}} | 未知颜色 }} → 参数未定义时返回"未知颜色"
特殊字符处理
  • 情况中的等号需转义
{{#switch: a=b 
| a{{=}}b = 模板转义 
| a=b = HTML转义 
}}

模板转义

底层代码

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

/** mediawiki-1.37.0\extensions\ParserFunctions\includes\ParserFunctions.php
 * {{#switch: comparison string
 * | case = result
 * | case = result
 * | ...
 * | default result
 * }}
 *
 * @link https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions##switch
 *
 * @param Parser $parser
 * @param PPFrame $frame
 * @param array $args
 * @return string
 */
public static function switch( Parser $parser, PPFrame $frame, array $args ) {
	if ( count( $args ) === 0 ) {
		return '';
	}
	$primary = self::decodeTrimExpand( array_shift( $args ), $frame );
	$found = $defaultFound = false;
	$default = null;
	$lastItemHadNoEquals = false;
	$lastItem = '';
	$mwDefault = $parser->getMagicWordFactory()->get( 'default' );
	foreach ( $args as $arg ) {
		$bits = $arg->splitArg();
		$nameNode = $bits['name'];
		$index = $bits['index'];
		$valueNode = $bits['value'];

		if ( $index === '' ) {
			# Found "="
			$lastItemHadNoEquals = false;
			if ( $found ) {
				# Multiple input match
				return trim( $frame->expand( $valueNode ) );
			} else {
				$test = self::decodeTrimExpand( $nameNode, $frame );
				/** @noinspection TypeUnsafeComparisonInspection */
				if ( $test == $primary ) {
					# Found a match, return now
					return trim( $frame->expand( $valueNode ) );
				} elseif ( $defaultFound || $mwDefault->matchStartToEnd( $test ) ) {
					$default = $valueNode;
					$defaultFound = false;
				} # else wrong case, continue
			}
		} else {
			# Multiple input, single output
			# If the value matches, set a flag and continue
			$lastItemHadNoEquals = true;
			// $lastItem is an "out" variable
			$decodedTest = self::decodeTrimExpand( $valueNode, $frame, $lastItem );
			/** @noinspection TypeUnsafeComparisonInspection */
			if ( $decodedTest == $primary ) {
				$found = true;
			} elseif ( $mwDefault->matchStartToEnd( $decodedTest ) ) {
				$defaultFound = true;
			}
		}
	}
	# Default case
	# Check if the last item had no = sign, thus specifying the default case
	if ( $lastItemHadNoEquals ) {
		return $lastItem;
	} elseif ( $default !== null ) {
		return trim( $frame->expand( $default ) );
	} else {
		return '';
	}
}


实际用例

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

原神 - ys

战双帕弥什 - zspms

明日方舟 - arknights

恋与深空 - lysk

崩坏:星穹铁道 - sr

代号鸢 - yuan

赛马娘 - umamusume

第五人格 - dwrg

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

三国杀 - sgs

尘白禁区 - sonw

黑神话:悟空 - wukong

WIKI实验室 - tools

地下城堡2 - dxcb2

战争雷霆 - warthunder

东方归言录 - touhoulostword

卡拉彼丘 - klbq

白荆回廊 - bjhl

女神转生 - persona

赛尔计划 - seerplan

幻塔 - ht

雷索纳斯 - resonance

绝区零 - zzz

重返未来:1999 - reverse1999

偶像大师灰姑娘女孩 - imascg

公主连结 - pcr

ミナシゴノシゴト - mnsg

无期迷途 - wqmt

奇迹暖暖 - qjnn

赛尔号 - seer

地下城堡3 - dxcb3

红警3 - redalert3

孙美琪疑案 - sunmeiqi

鸣潮 - wutheringwaves

交错战线 - crosscore

千年之旅 - elf

生死狙击2 - ssjj2

世界之外 - world

戴森球计划 - dsp

梦幻模拟战 - langrisser

StardewValley星露谷物语 - stardewvalley

赛尔号星球大战 - seerwar

觅长生 - mcs

QQ飞车手游 - qqspeed

放置江湖 - fzjh

方舟指令 - fzzl

少前2:追放 - gf2

偶像荣耀/idoly pride - idolypride

深空之眼 - dhmmr