跳转到内容

帮助:解析器函数

本页使用了标题或全文手工转换
来自维基学院

解析器函数是由一个MediaWiki扩展mw:Extension:ParserFunctions提供,包含多个解析函数解释器。本扩展的典型语法是:

{{#函数名:参数1|参数2|参数3|...}}

目前有预定义的函数:exprififeqiexprswitchrand暂时被废除)。

各函数名都对大小写不敏感。

语句中的空格、换行等空白字符将被省略。

expr函数,计算数学表达式。语法为:

{{#expr:表达式}}

表达式支持的运算符有:

运算符 名称 优先级 元数 结合性 样例
+ 9 1 {{#expr:+ 7}} = 7
- 9 1 {{#expr:- 7}} = -7
not 逻辑非 9 1 {{#expr:not 7}} = 0
* 8 2 {{#expr:30 * 7}} = 210
/ 8 2 {{#expr:30 / 7}} = 4.2857142857143
div 8 2 {{#expr:30 div 7}} = 4.2857142857143
mod 8 2 {{#expr:30 mod 7}} = 2
+ 6 2 {{#expr:30 + 7}} = 37
- 6 2 {{#expr:30 - 7}} = 23
round 舍入(最大9) 5 2 {{#expr:30 / 7 round 7}} = 4.2857143
= 等于 4 2 {{#expr:params}} = 0
< 小于 4 2 {{#expr:30 < 7}} = 0
> 大于 4 2 {{#expr:30 > 7}} = 1
<= 小于等于 4 2 {{#expr:params}} = 0
>= 大于等于 4 2 {{#expr:params}} = 1
<> 不等于 4 2 {{#expr:30 <> 7}} = 1
!= 不等于 4 2 {{#expr|30 != 7}} = 1
and 逻辑与 3 2 {{#expr:30 and 7}} = 1
or 逻辑或 2 2 {{#expr:30 or 7}} = 1

round运算对运算数正负,位数正负都有不同的表现,参见下例。

逻辑运算符把假映射为0,把真映射为非0,且返回值只有0或1。

同一表达式中先计算高优先级运算。括号优先级高于一切。

if函数是一个if-then-else(如果、那么、否则)结构,和Excelif函数类似。语法是:

{{#if:判断字符串|那么字符串|否则字符串}}
{{#if:判断字符串|那么字符串}}

若判断字符串为非空字符串(忽略前导或后缀空格),则函数返回那么字符串;若判断字符串是空字符串,则返回否则字符串。否则字符串可被省略而不会造成错误,但函数在判断字符串为空时便会返回空字符串。

ifeq比较两个字符串,返回比较结果。语法为:

{{#ifeq:字符串1|字符串2|相等时返回的字符串|不相等时返回的字符串}}

注意:两个空字符串是相等的。

示例:

假设模板{{Ifeq test}}的内容是

{{#ifeq:{{{lang}}}|zh|我使用中文|I don't use Chinese}}

{{Ifeq test|lang=zh}}的结果是“我使用中文”;而{{Ifeq test|lang=en|I prefer English}}的结果是“I don't use Chinese”。

ifexist根据指定名称的页面是否存在,返回两个参数中的一个。用法:

{{#ifexist:待测页面标题|存在文字|不存在文字}}

注意不能跨维基使用。

ifexist是一个高开销方法,如果超过调用次数限制,超出部分的调用默认为输出不存在时的内容。

示例:

首先,我们已经知道test页面不存在,User:用户名不存在,维基百科页面存在,英文维基百科的页面en:Minecraft存在,维基词典里面wikt:hello存在。

  • {{#ifexist:test|有test页面|无test页面}} → 无test页面
  • {{#ifexist:User:用户名|该用户页存在|该用户页不存在}} → 该用户页不存在
  • {{#ifexist:维基百科||}}
  • {{#ifexist:en:Minecraft|1|0}} → 0
  • {{#ifexist:wikt:hello|1|0}} → 0

ifexpr计算数学表达式,并根据计算结果返回字符串。

{{#ifexpr:表达式|表达式不为0的结果|表达式为0的结果}}

表达式语法与expr相同。

switch将一个值与多个预设值比较,若有匹配时则返回指定字符串,即双射。语法是:

{{#switch:比较值
|预设值1 = 结果1
|预设值2 = 结果2
|...
|预设值n = 结果n
|#default = 缺省结果
}}

switch将从左往右逐一尝试,直到出现匹配。函数将返回第一个匹配值对应的结果,而忽略后面的匹配值。如果没有匹配,函数将返回缺省结果。缺省结果是指的#default=后面的内容。其中#default=在结果不包含等号时是可以省略的。如果缺省结果没有设置,函数将返回空串。

注意:“缺省结果”是最后一个没有等号的预设值或“#default”预设值对应的结果;如果期望把一个包含“=”号的字符串作为缺省结果,则必须采用“#default”预设值形式。例如:

#default = <span style="color:red;">red</span>

switch也可用作满射(多对一,避免重复设置结果)。即某预设值后未设置结果,这样如果该预设值与比较值匹配,则函数返回第一个有结果的预设值的结果。例如:

{{#switch:比较值
|预设值1
|预设值2
|预设值3 = 结果3
|缺省结果
}}

如果比较值与预设值1、预设值2或预设值3匹配,都将返回结果3。注意:“#default”后必须有“=”,但其他预设值可以使用“#default”的结果。

switch也可以与invoke搭配,来完成随机显示的功能,详见Help:随机显示

time是一个时间日期格式化函数,它的语法为:

{{#time:格式参数}}

或者

{{#time:格式参数|时间参数}}

如果时间参数未指定,则使用该条目被转换为HTML的时间(值)。注意到由于缓存的缘故,这与条目被浏览的时间可能会有高达1星期的偏差。因此可能需要手工更新,方法是加上action=purge参数访问页面。

格式参数是一种格式字符,与在PHP的date中的用法相似。

下列格式代码与在PHP中的意义一样。所不同的是:如果时间未被指定,则显示文章最后一次被转换成HTML的时间。由于缓存的关系,此时间和你浏览文章的时间可能有最长一个星期的差别。所以有时可能需要人工更新数据,方法是编辑文章但不做任何修改即保存。

以下格式代码和PHP中date()函数意义相同。除了国际化(主要是语言)造成的差别以外,所有和PHP的不同点都应当作为软件的错误进行报告。其中所有的数字输出都会被替换成当地语言的时间格式,可以使用xn(见下文)恢复成显示原来的数字。

代码 描述 输出(示例)
d 一个月中的第 n 天,不足两位补充0 04
D 星期的缩写,通常不国际化
j 一个月中的第 n 天,不足两位不补0 3
l 星期的全称,通常不国际化 星期二
F 月份的的全称,通常需要国际化 12月
m 数字表示的月份,不足两位补充0 01-12
M 月份的的缩写,通常需要国际化 12月
n 数字表示的月份,不足两位不补0 1-12
Y 四位年份 2024
y 二位年份 24
H 小时,不足两位补充0 00-23
i 分钟,不足两位补充0 00-59
s 秒,不足两位补充0 00-59

以下代码是对PHP作出的扩展:

代码 描述
xn 将接下来的数字代码恢复成ASCII中的阿拉伯数字例如,在印地语中,{{#time:H, xnH}}输出“०६, 06”。
xr 将接下来的数字代码显示成罗马数字。
xg 输出月份名字的属格,只针对那些区分主格和属格的语言。
xx 输出“x”。

任何其他字符都将不做处理直接输出。你也可以用引号来输出未经处理的字符串。

  • 引号中的字符直接输出(但不输出引号),没有配对的引号也直接输出。例如:
    • {{#time:"现在是"F}} → 现在是12月
    • {{#time:i's"}} → 17'42"
  • 像PHP的date()函数一样的反斜杠转义也是支持的。\H直接输出H\"直接输出"

未来可能会增加更多格式代码,可能是完善PHP中已有功能,也可能是增加新功能。

时间参数的格式参照PHP的strtotime()函数。它同时支持相对时间,如"+10 hours",用来表示时区转换。更多信息参见the GNU tar manual[失效链接]

下表以国际协调时间(UTC)2024年12月17日(星期二)20时17分42秒(北京时间2024年12月18日(星期三)04时17分42秒)为例说明各格式参数的作用。

格式参数 说明 显示结果
A 显示AM或PM PM
a 显示am或pm pm
c 显示长日期 2024-12-17T20:17:42+00:00
D 星期数,以一个汉字显示
d 日期日数,有0补齐 17
FM 月份 12月
Gg 当前UTC时间小时数,1位或2位数字 20
Hh 小时数,2位数字 20
i 分钟数,2位数字 17
j 日数,2位数字 17
L 日期星期数,1位数字,星期日为1,星期六为7 1
l 日期星期数,3位汉字 星期二
m 月份数,2位数字 12
N 星期数,星期一为1,星期日为7 2
n 月份数,1位或2位数字 12
r 英文长日期格式 Tue, 17 Dec 2024 20:17:42 +0000
s 秒数 42
t 该月天数 31
U 时间序号,1970-1-1 0:0:1为1,参见UNIX时间 1734466662
W 日期周数,显示日期为当年第几周 51
w 星期数,星期日为0,星期六为6 2
Y 日期年份,4位数字 2024
y 日期年份,2位数字 24
z 显示日期为当年第几日 351

系统默认的时间参数为当前UTC+0时间,可以使用{{#time:参数|+8 hours}}得到当前北京时间(UTC+8时间)。

时间参数可以使用绝对时间,如“2008-12-31 23:59:59”,也可以使用相对时间,如“+7 days”或者“-5 hours”得到默认时间7日之后或默认时间5小时之前的时间。也可以二者混合使用,比如{{#time:Y-m-d H:i:s|2001-2-3 04:05:06 +1 year +2 months +3 days +4 hours +5 minutes +6 seconds}}返回“2002-04-06 08:10:12”。

使用xr可以在其后显示罗马数字,如{{#time:xrY年xrm月xrd日|2008-12-31}}显示为“MMVIII年XII月XXXI日”。

产生与签名格式相同的时间语法为:{{#time:Y年n月j日 (D) H:i (\U\TC)}},显示为“2024年12月17日 (二) 20:17 (UTC)”(亦可将UTC直接放在time外面,如{{#time:Y年n月j日 (D) H:i}} (UTC))。

#language得到指定语言代码的该语言名称(以当地语言表示)。

  • {{#babel:babelcode1|babelcode2|...}}

替换为{{babel}}模板,见Extension:Babel

调用位于Scribunto中的模块,见维基百科:Lua

应用subst:到解析器函数,必须在subst:和#之间不能有空格,才可以正常工作。

解析器函数中由于使用了|管道符做参数分隔符,所以不能包括表格所需要的|符。要想在输出中包含表格,可以通过以下两个办法达到:

  1. 通过嵌套模板来达到隐藏|的目的。比如:{{!}}
  2. 使用HTML语法。