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

帮助:解析函数/iferror

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

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

iferror

条件分支函数,基于错误检测。出自扩展 ParserFunctions

检测输入wikitext解析结果中是否存在错误标记(由class="error"的HTML元素表示),并根据检测结果返回不同值。

语法

{{#iferror: 测试wikitext | 错误时返回值 | 正确时返回值 }}

  • 测试wikitext:需要检测的wikitext,如#expr表达式
  • 错误时返回值(可选):当检测到错误时返回的内容。如果留空且检测到错误,将返回空字符串
  • 正确时返回值(可选):当未检测到错误时返回的内容。如果留空且未检测到错误,将返回测试字符串本身


错误检测基于HTML元素中是否包含class="error"属性,仅限strong/span/p/div标签。这类错误可能来自exprtimerel2abs产生,模板(Templates)错误,如循环、递归和其他解析器错误也能产生。

示例

  • 基本用法 {{#iferror: {{#expr: 1 + 2 }} | error | correct }} → correct
  • 检测错误 {{#iferror: {{#expr: 1 + X }} | error | correct }} → error
  • 省略正确返回值 {{#iferror: {{#expr: 10/2 }} | error }} → 5
  • 同时省略返回值 {{#iferror: <span class="error">Err</span> }}
  • 显式错误元素 {{#iferror: <div class="warning error">警示</div> | 发生错误 }} → 发生错误

底层代码

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

/** mediawiki-extensions-ParserFunctions-REL1_37\includes\ParserFunctions.php
 * {{#iferror: test string | value if error | value if no error }}
 *
 * Error is when the input string contains an HTML object with class="error", as
 * generated by other parser functions such as #expr, #time and #rel2abs.
 *
 * @link https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions##iferror
 *
 * @param Parser $parser
 * @param PPFrame $frame
 * @param array $args
 * @return string
 */
public static function iferror( Parser $parser, PPFrame $frame, array $args ) {
	$test = isset( $args[0] ) ? trim( $frame->expand( $args[0] ) ) : '';
	$then = $args[1] ?? false;
	$else = $args[2] ?? false;

	if ( preg_match(
		'/<(?:strong|span|p|div)\s(?:[^\s>]*\s+)*?class="(?:[^"\s>]*\s+)*?error(?:\s[^">]*)?"/',
		$test )
	) {
		$result = $then;
	} elseif ( $else === false ) {
		$result = $test;
	} else {
		$result = $else;
	}
	if ( $result === false ) {
		return '';
	}

	return trim( $frame->expand( $result ) );
}
代码逻辑:
  • 通过正则表达式匹配包含class="error"的HTML元素(支持strong/span/p/div标签)
  • 当测试字符串包含错误标记时,返回第二个参数的内容
  • 当测试字符串不含错误时:
    • 如果提供了第三个参数,返回第三个参数
    • 如果未提供第三个参数,直接返回原始测试字符串
  • 当错误返回值参数被省略时(即未提供第二个参数),错误情况下返回空字符串

实际用例

一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考
恋与深空 - lysk

WIKI实验室 - tools

StardewValley星露谷物语 - stardewvalley

克鲁赛德战记 - cq

诺亚幻想 - nyhx