帮助:解析器函数
此帮助页面需要更新。 (2018年9月5日) |
本页为操作指南,用于介绍中文维基百科社群的一些实现和操作方式。 本文只是论述,不属于方针或指引。如果本指南与方针或指引起冲突或不一致,请以方针或指引的条文为准。 |
解析器函数是MediaWiki扩展,由mw:Extension:ParserFunctions提供,包含多个解析函数解释器。本扩展的典型语法是:
{{#函数名:参数1|参数2|参数3|...}}
目前有预定义的函数expr
、if
、ifeq
、ifexpr
、switch
(rand
暂时不用)。
各函数名都不分大小写。
忽略语句的空格、换行等空白字符。
函数
[编辑]expr
[编辑]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:30 = 7}} = 0
|
< |
小于 | 4 | 2 | 左 | {{#expr:30 < 7}} = 0
|
> |
大于 | 4 | 2 | 左 | {{#expr:30 > 7}} = 1
|
<= |
小于等于 | 4 | 2 | 左 | {{#expr:30 <= 7}} = 0
|
>= |
大于等于 | 4 | 2 | 左 | {{#expr:30 >= 7}} = 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
函数有if-then-else
(如果、那么、否则)结构,和Excel的if
函数类似。语法是:
{{#if:判断字符串|那么字符串|否则字符串}} {{#if:判断字符串|那么字符串}}
若“判断字符串”不是空字符串(忽略前导或后缀空格),则函数返回“那么字符串”;若“判断字符串”是空字符串,则返回“否则字符串”。“否则字符串”可省略而不会出错,但函数在“判断字符串”为空时便会返回空字符串。
if函数还可用在模板语法中检查有否使用某参数。若满足条件,可在调用此模板的页面中显示或不显示特定内容。
{{#if:{{{1|}}}|匿名参数1不为空时输出的结果|匿名参数1为空时输出的结果}} {{#if:{{{xx|}}}{{{yy|}}}|xx或yy参数不为空时输出的结果|xx和yy参数都为空时输出的结果}}
ifeq
[编辑]ifeq
比较两串字符串,传回比较结果。语法为:
{{#ifeq:字符串1|字符串2|相等时返回的字符串|不相等时返回的字符串}}
注意:两串空串相等。
示例:
假设模板{{Ifeq test}}
的内容是
{{#ifeq:{{{lang}}}|zh|我使用中文|I don't use Chinese}}
则{{Ifeq test|lang=zh}}
的结果是“我使用中文”;而{{Ifeq test|lang=en}}
的结果是“I don't use Chinese”。
ifexist
[编辑]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
计算数学表达式,并根据计算结果返回字符串。
{{#ifexpr:表达式|表达式不为0的结果|表达式为0的结果}}
表达式语法与expr
相同。
switch
[编辑]switch
将一值与多项预设值比较,若有匹配时则返回指定字符串,即双射。语法是:
{{#switch:比较值 |预设值一 = 结果一 |预设值二 = 结果二 |... |预设值某 = 结果某 |#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:格式参数}}
或者
{{#time:格式参数|时间参数}}
如果时间参数未指定,就用条目转换为HTML的时间(值)。缓存问题,这与浏览条目的时间可能会高达1星期偏差,可能要人手更新,方法是加上action=purge参数访问页面。
格式参数是种格式字符,与在PHP的date中的用法相似。
下列格式代码与在PHP中的意义一样。所不同的是:如果时间未指定,则显示文章最后一次转换成HTML的时间。缓存问题,此时间和你浏览文章的时间可能有最长一星期的差别,有时可能要亲自更新数据,方法是编辑文章但不修改任何内容即保存。
以下格式代码和PHP函数date()
同义。除了国际化(主要是语言)差别以外,所有和PHP的不同点都应报告为软件错误。其中所有的数字输出都会替换成当地语言的时间格式,可以使用xn
(见下文)恢复成显示原来的数字。
代码 | 描述 | 输出(示例) |
---|---|---|
d |
一个月第n天,不足两位补0 | 04 |
D |
星期缩写,通常不国际化 | 二 |
j |
一个月第n天,不足两位不补0 | 3 |
l |
星期全称,通常不国际化 | 星期二 |
F |
月份全称,通常需要国际化 | 11月 |
m |
数字表示的月份,不足两位补0 | 01-12 |
M |
月份缩写,通常需要国际化 | 11月 |
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”。 |
其他字符都不处理直接输出。你也可以用引号来输出未处理字符串。
- 引号中的字符直接输出(但不输出引号),没有配对的引号也直接输出,如
- 像PHP的
date()
函数一样的反斜杠转义也是支持的。\H
直接输出H
,\"
直接输出"
。
未来可能会增加更多格式代码,可能是完善PHP现有功能,也可能是增加新功能。
时间参数格式参照PHP的strtotime()
函数。它同时支持相对时间,如“+10 hours”,用来表示时区转换。更多信息参见the GNU tar manual[失效链接]。
下表以国际协调时2024年11月19日(星期二)11时23分04秒(东八区时间2024年11月19日(星期二)19时23分04秒)为例说明各格式参数的作用。
格式参数 | 说明 | 显示结果 |
---|---|---|
A |
显示AM或PM | AM |
a |
显示am或pm | am |
c |
显示长日期 | 2024-11-19T11:23:04+00:00 |
D |
星期数,以一汉字显示 | 二 |
d |
日期日数,有0补齐 | 19 |
F 或M |
月份 | 11月 |
G 或g |
当前UTC时间小时数,1位或2位数 | 11 |
H |
小时数,2位数(24小时制) | 11 |
h |
小时数,2位数 (12小时制) | 11 |
i |
分钟数,2位数 | 23 |
j |
日数,2位数 | 19 |
L |
日期星期数,1位数,星期日为1,星期六为7 | 1 |
l |
日期星期数,3位汉字 | 星期二 |
m |
月份数,2位数 | 11 |
N |
星期数,星期一为1,星期日为7 | 2 |
n |
月份数,1位或2位数 | 11 |
r |
英文长日期格式 | Tue, 19 Nov 2024 11:23:04 +0000 |
s |
秒数 | 04 |
T |
UTC | UTC |
t |
该月天数 | 30 |
U |
时间序号,1970-1-1 0:0:1为1,参见UNIX时间 | 1732015384 |
W |
日期周数,显示日期为当年第几周 | 47 |
w |
星期数,星期日为0,星期六为6 | 2 |
Y |
日期年份,4位数 | 2024 |
y |
日期年份,2位数 | 24 |
z |
显示日期为当年第几日 | 323 |
系统默认的时间参数为当前UTC+0时间,可以用{{#time:参数|+8 hours}}
得到当前东八区时间。
时间参数可用绝对时间,如“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}} (UTC)
,显示为“2024年11月19日 (二) 11:23 (UTC)”(亦可用参数T
:{{#time:Y年n月j日 (D) H:i (T)}}
)。
timef
[编辑]#timef
提供更便捷的指定语言化的日期时间格式化输出。
例子:{{#timef: date/time object | format type | language code }}
date/time object
:对应{{#timef|输出格式|时间对象}}
的“时间对象”部分,如不指定,则为页面渲染时的当时时间。format type
:格式类型,枚举值,可选:- time:只输出时间
- date:只输出日期
- both:同时输出日期和时间,不指定时的默认值
- pretty:以缩写方式只输出日期,不包括年份,部分语言没有这个格式,如果这样则等价于both
language code
:指定对应语言的输出格式,不指定时默认为当前页面内容语言。
language
[编辑]#language
得到指定语言代码的语言名(以当地语言表示)。
{{#language:zh}}
→ 中文{{#language:zh-cn}}
→ 中文(中国大陆){{#language:zh-tw}}
→ 中文(臺灣){{#language:zh-hk}}
→ 中文(香港){{#language:zh-sg}}
→ 中文(新加坡){{#language:de}}
→Deutsch{{#language:en}}
→English{{#language:ja}}
→ 日本語{{#language:nl}}
→Nederlands
加入第二参数时,显示该语言在第二参数语言中的名称。
{{#language:de|en}}
→ German{{#language:en|ja}}
→ 英語{{#language:ja|nl}}
→ Japans{{#language:nl|zh}}
→ 荷兰语{{#language:zh|de}}
→ Chinesisch
babel
[编辑]{{#babel:babelcode1|babelcode2|...}}
替换为{{babel}}
模板,见Extension:Babel。
invoke
[编辑]{{#invoke:module|function|arg1|arg2|...}}
subst
[编辑]应用subst:到解析器函数,subst:和#之间没有空格才可以正常工作。
表格
[编辑]解析器函数用管道符|
分隔参数,不能包括表格所需要的|
符。要输出表格,可以:
- 用嵌套模板隐藏
|
,比如{{!}}
- 使用HTML语法。