Help:解析器函数:修订间差异

帮助页面
添加的内容 删除的内容
→‎invoke:​ // Edit via Wikiplus
无编辑摘要
 

(未显示2个用户的23个中间版本)

第1行: 第1行:
{{操作指南|H:PF|H:FUNC}}
{{not|Help:魔术字{{!}}魔术字}}
{{NoteTA
{{NoteTA
|G1 = IT
|G1 = IT
|G2 = MediaWiki
|G2 = MediaWiki
}}
}}
{{操作指南|H:PF|H:FUNC}}
'''解析器函数'''是一个MediaWiki扩展,由[[mw:Extension:ParserFunctions]]提供,包含多个解析函数解释器。本扩展的典型语法是:
{{not|Help:魔术字}}


'''解析器函数'''是一个MediaWiki扩展,由[[mw:Extension:ParserFunctions]]提供。
<pre>-{}-
{{#函数名:参数1|参数2|参数3|...}}
</pre>


ParserFunctions扩展提供11个額外的'''解析器函数'''以补充MediaWiki固有的“[[Help:魔术字|魔术字]]”。('''有可能'''会配置到额外的解析器函数以支持运行;这些字符串函数已在其他文档页面记载。)
目前有预定义的函数:<code>expr</code>、<code>if</code>、<code>ifeq</code>、<code>ifexpr</code>、<code>switch</code>(<code>rand</code>暂时被废除)。


此扩展提供的所有解析器函数均采用以下形式:
各函数名都对大小写不敏感。
:<code><nowiki>{{</nowiki>'''#函数名''': ''参数1'' | ''参数2'' | ''参数3''... <nowiki>}}</nowiki></code>


语句中的空格、换行等空白字符将被省略。
各函数名都对大小写不敏感。语句中的空格、换行等空白字符将被省略。


== 函数 ==
== #expr ==
=== <tt>expr</tt> ===
{{See also|Help:计算}}


{| class="wikitable" style="float:right; width:30%; margin-{{dir|{{pagelang}}|right|left}}:1em"
<code>expr</code>函数,计算[[数学]]表达式。语法为:
|-
! 类型
! 运算符号
|-
| 分组(括弧)
| style="word-spacing: 0.5em; font-weight: bold;" | <code>( )</code>
|-
| 数字
| <code>'''1234.5'''</code> &nbsp; <code>'''e'''</code>&nbsp;(2.718) &nbsp; <code>'''pi'''</code>&nbsp;(3.142)
|-
| |
| 二进制运算符 <code>'''e'''</code> &nbsp; 一元 <code>'''+'''</code>,<code>'''-'''</code>
|-
| 一元
| style="word-spacing: 0.5em; font-weight: bold;" | <code>not ceil trunc floor abs exp ln sin cos tan acos asin atan</code>
|-
| rowspan="3" | 二进制
| style="word-spacing: 0.5em; font-weight: bold;" | <code>^</code>
|-
| style="word-spacing: 0.5em; font-weight: bold;" | <code>* / div mod</code>
|-
| style="word-spacing: 0.5em; font-weight: bold;" | <code>+ -</code>
|-
| 取整
| style="word-spacing: 0.5em; font-weight: bold;" | <code>round</code>
|-
| rowspan="3" | 逻辑
| style="word-spacing: 0.5em; font-weight: bold;" | <code>= != <> > < >= <=</code>
|-
| style="word-spacing: 0.5em; font-weight: bold;" | <code>and</code>
|-
| style="word-spacing: 0.5em; font-weight: bold;" | <code>or</code>
|}


这个函数计算数学表达式并返回计算值。
<pre>-{}-
在nsp=0中可以通过<code>mw.ext.ParserFunctions.expr</code>来使用此函数。
{{#expr:表达式}}

</pre>
:<code><nowiki>{{#expr:</nowiki> ''表达式'' <nowiki>}}</nowiki></code>

右表依优先级列出了支持的运算符。运算结果的精度和格式受运行wiki服务器操作系统和站点语言的数字格式影响可能存在差异。

使用[[布尔运算|布尔代数]]时,0表示<code>false</code>,其他任何非0数值(无论正负)均表示<code>true</code>:

:<syntaxhighlight lang="moin" inline>{{#expr: 1 and -1 }}</syntaxhighlight> → '''{{#expr: 1 and -1 }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: 1 and 0 }}</syntaxhighlight> → '''{{#expr: 1 and 0 }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: 1 or -1 }}</syntaxhighlight> → '''{{#expr: 1 or -1 }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: -1 or 0 }}</syntaxhighlight> → '''{{#expr: -1 or 0 }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: 0 or 0 }}</syntaxhighlight> → '''{{#expr: 0 or 0 }}'''

空表达式返回空值,无效的表达式返回错误信息,使用<code>[[##iferror|#iferror]]</code>函数检查错误:

:<syntaxhighlight lang="moin" inline>{{#expr: }}</syntaxhighlight> → ''' {{#expr: }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: 1+ }}</syntaxhighlight> → '''{{#expr: 1+ }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: 1 = }}</syntaxhighlight> → '''{{#expr: 1 = }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: 1 foo 2 }}</syntaxhighlight> → '''{{#expr: 1 foo 2 }}'''

置于数字前或数字后的加减号是有意义的,会被视为正负号而不会报错:

:<syntaxhighlight lang="moin" inline>{{#expr: +1 }}</syntaxhighlight> → '''{{#expr: +1 }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: -1 }}</syntaxhighlight> → '''{{#expr: -1 }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: + 1 }}</syntaxhighlight> → '''{{#expr: + 1 }}'''
:<syntaxhighlight lang="moin" inline>{{#expr: - 1 }}</syntaxhighlight> → '''{{#expr: - 1 }}'''

注意:使用魔术字输出数值时,首先要将其格式化以去除逗号,获得纯数字。例如:<nowiki>{{NUMBEROFUSERS}}</nowiki>输出{{NUMBEROFUSERS}},而期望的输出值是{{formatnum:{{NUMBEROFUSERS}}|R}},使用<code><nowiki>{{</nowiki>formatnum<nowiki>:{{NUMBEROFUSERS}}|R}}</nowiki></code>便可以实现。对于某些语言,格式化数字尤为重要。例如孟加拉语中,<nowiki>{{NUMBEROFUSERS}}</nowiki>的输出结果是৩০,০৬১。

:<syntaxhighlight lang="moin" inline>{{#expr:{{NUMBEROFUSERS}}+100}}</syntaxhighlight> → ''' {{#expr:{{NUMBEROFUSERS}}+100}}'''
:<syntaxhighlight lang="moin" inline>{{#expr:{{formatnum:{{NUMBEROFUSERS}}|R}}+100}}</syntaxhighlight> → '''{{#expr:{{formatnum:{{NUMBEROFUSERS}}|R}}+100}}'''

{{Warning|1=运算符<code>mod</code>會對第二參數的某些值給出錯誤的结果:
<!-- the following line now produces the correct value:
:<syntaxhighlight lang="moin" inline>{{#expr: 123 mod (2^32-1)}}</syntaxhighlight> → '''{{#expr: 123 mod (2^32-1)}}''' (should be 123)<br>
but see this one: -->
:<syntaxhighlight lang="moin" inline>{{#expr: 123 mod (2^64-1)}}</syntaxhighlight> → {{#expr: 123 mod (2^64-1)}} (輸出一個空字符串;應該是123)<br>
<!-- and the following bug has now been solved, as shown on the linked bug report:
Depending on the specification and configuration of the server running the wiki, there may also be other errors:
:<syntaxhighlight lang="moin" inline>{{#expr: 20060618093259 mod 10000}}</syntaxhighlight> → '''{{#expr: 20060618093259 mod 10000}}''' in most cases, but may occasionally give '''-6357'''. See {{bugzilla|6356}}.
-->
}}
{{demo-inline|1=如果你想要进行基于日期时间的计算(如检测当前日期时间是否超过指定日期时间),首先用<nowiki>{{#time: xNU }}</nowiki>将日期时间转换为距1970年1月1日的秒数,再对秒数进行加减运算。}}

<span id="Rounding"></span>
=== 四舍五入 ===

将左边的数字[https://php.net/function.round 四舍五入]为1/10的幂的倍数,指数等于右边给出的数字的截断值(truncated value)。


向上、向下取整分别使用<code>ceil</code>或<code>floor</code>。
表达式支持的运算符有:


{| class="wikitable"
{| class="wikitable"
! 案例
! 运算符 || 名称 || 优先级 || 元数 || 结合性 || 样例
! 结果
! 舍入方式
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> 1/3 round 5 }}</code> || {{#expr: 1/3 round 5 }} || 最终的数字小于5,所以没有明显的取整发生 (0.333333… → 0.33333)
| <code>+</code> || [[正]] || 9 || 1 || 右 || {{tlxm|#expr|+ 7}} = {{#expr:+ 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr: 1/6 round 5 }}</nowiki></code> || {{#expr: 1/6 round 5 }} || 最终的数字大于5,所以被向上取整 (0.166666… → 0.16667)
| <code>-</code> || [[负]] || 9 || 1 || 右 || {{tlxm|#expr|- 7}} = {{#expr:- 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr: 8.99999/9 round 5 }}</nowiki></code> || {{#expr: 8.99999/9 round 5 }} || 同理,最后一位数因后一位而加1,进而引起了前面的进位 (0.999998… → 1.00000 → 1)
| <code>not</code> || [[逻辑非]] || 9 || 1 || 右 || {{tlxm|#expr|not 7}} = {{#expr:not 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> 1234.5678 '''round -2''' }}</code> || {{#expr: 1234.567 round -2 }} || 舍入至最近的整百数,负值在小数点左边。
| <code>*</code> || [[乘]] || 8 || 2 || 左 || {{tlxm|#expr|30 * 7}} = {{#expr:30 * 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> 1234.5678 '''round 2''' }}</code> || {{#expr: 1234.567 round 2 }} || 舍入至最近的整1/100数,因为正值会舍入至小数点右边。
| <code>/</code> || [[除]] || 8 || 2 || 左 || {{tlxm|#expr|30 / 7}} = {{#expr:30 / 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> 1234.5678 round 2'''.3''' }}</code> || {{#expr: 1234.567 round 2.3 }} || 舍入指数的小数点在舍入结果中不起作用
| <code>div</code> || 除 || 8 || 2 || 左 || {{tlxm|#expr|30 div 7}} = {{#expr:30 div 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> '''trunc''' 1234.5678 }}</code> || {{#expr: trunc 1234.567 }} || 小数部分被全部舍弃(截断)
| <code>mod</code> || [[同餘|模]] || 8 || 2 || 左 || {{tlxm|#expr|30 mod 7}} = {{#expr:30 mod 7}}
|-
|-
! colspan=3 |四舍五入至最近的整数
| <code>+</code> || [[加]] || 6 || 2 || 左 || {{tlxm|#expr|30 + 7}} = {{#expr:30 + 7}}
|-
|-
| <code>-</code> || [[减]] || 6 || 2 || 左 || {{tlxm|#expr|30 - 7}} = {{#expr:30 - 7}}
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> 1/3 '''round 0''' }}</code> || {{#expr: 1/3 round 0 }} || 向下取整至0
|-
|-
| <code>round</code> || [[舍入]](最大9) || 5 || 2 || 左 || {{tlxm|#expr|30 / 7 round 7}} = {{#expr:30 / 7 round 7}}
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> 1/2 '''round 0''' }}</code> || {{#expr: 1/2 round 0 }} || 向上取整至1
|-
|-
| <code>=</code> || [[等于]] || 4 || 2 || 左 || <code><nowiki>{{#expr:30 = 7}}</nowiki></code> = {{#expr:30 = 7}}
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> 3/4 '''round 0''' }}</code> || {{#expr: 3/4 round 0 }} || 向上取整至1
|-
|-
| <code><</code> || 小于 || 4 || 2 || 左 || {{tlxm|#expr|30 < 7}} = {{#expr:30 < 7}}
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> -1/3 '''round 0''' }}</code> || {{#expr: -1/3 round 0 }} || 向上取整至0
|-
|-
| <code>></code> || 大于 || 4 || 2 || 左 || {{tlxm|#expr|30 > 7}} = {{#expr:30 > 7}}
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> -1/2 '''round 0''' }}</code> || {{#expr: -1/2 round 0 }} || 向下取整至-1
|-
|-
| <code><=</code> || 小于等于 || 4 || 2 || 左 || <code><nowiki>{{#expr:30 <= 7}}</nowiki></code> = {{#expr:30 <= 7}}
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> -3/4 '''round 0''' }}</code> || {{#expr: -3/4 round 0 }} || 向下取整至-1
|-
|-
! colspan=3 |使用ceil和floor向上或向下取整
| <code>>=</code> || 大于等于 || 4 || 2 || 左 || <code><nowiki>{{#expr:30 >= 7}}</nowiki></code> = {{#expr:30 >= 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> '''ceil('''1/3''')''' }}</code> || {{#expr: ceil(1/3) }} || 向上取整至1
| <code><></code> || [[不等于]] || 4 || 2 || 左 || {{tlxm|#expr|30 <> 7}} = {{#expr:30 <> 7}}
|-
|-
| <code>!=</code> || 不等于 || 4 || 2 || 左 || <code><nowiki>{{#expr:30 != 7}}</nowiki></code> = {{#expr:30 != 7}}
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> '''floor('''1/3''')''' }}</code> || {{#expr: floor(1/3) }} || 向下取整至0
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> '''ceil('''-1/3''')''' }}</code> || {{#expr: ceil(-1/3) }} || 向上取整至0
| <code>and</code> || [[逻辑与]] || 3 || 2 || 左 || {{tlxm|#expr|30 and 7}} = {{#expr:30 and 7}}
|-
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> '''floor('''-1/3''')''' }}</code> || {{#expr: floor(-1/3) }} || 向下取整至-1
| <code>or</code> || [[逻辑或]] || 2 || 2 || 左 || {{tlxm|#expr|30 or 7}} = {{#expr:30 or 7}}
|-
| <code style="white-space:nowrap;"><nowiki>{{#expr:</nowiki> '''ceil''' 1/3 }}</code> || {{#expr: ceil 1/3 }} || 没有取整,因为1本来就是整数<br>{{Warning|1=注意会被解析为'''(ceil''' 1''')'''/3,而不是你想象中的'''ceil('''1/3''')'''}}
|}
|}


<span id="Strings"></span>
<code>round</code>运算对运算数正负,位数正负都有不同的表现,参见下例。
=== 字符串 ===


表达式函数只用于仅含有数字和运算符号的表达式,而字母字符串和其它符号不在此列。若需要比较字符串,可以用[[#ifeq]]替代。
逻辑运算符把假映射为0,把真映射为非0,且返回值只有0或1。


:<syntaxhighlight lang="moin" inline>{{#expr: "a" = "a" }}</syntaxhighlight> → '''{{#expr: "a" = "a" }}'''
同一表达式中先计算高优先级运算。括号优先级高于一切。
:<syntaxhighlight lang="moin" inline>{{#expr: a = a }}</syntaxhighlight> → '''{{#expr: a = a }}'''
:<syntaxhighlight lang="moin" inline>{{#ifeq: a | a | 1 | 0 }}</syntaxhighlight> → '''{{#ifeq: a | a | 1 | 0 }}'''


=== <tt>if</tt> ===
== #if ==
这个函数判断一个字符串是否为空。只包含空格的字符串被视为空字符串。
<code>if</code>函数是一个<code>if-then-else</code>(如果、那么、否则)结构,和[[Excel]]的<code>if</code>函数类似。语法是:


:<code><nowiki>{{#if:</nowiki> ''测试字符串'' | ''测试字符串非空时的取值'' | ''测试字符串为空或仅包含空白字符时的取值'' <nowiki>}}</nowiki></code>
<pre>-{}-
{{#if:判断字符串|那么字符串|否则字符串}}
{{#if:判断字符串|那么字符串}}
</pre>


:<code><nowiki>{{#if:</nowiki> 参数1 | 参数2 | 参数3 <nowiki>}}</nowiki></code>
若“判断字符串”为非空字符串(忽略前导或后缀空格),则函数返回“那么字符串”;若“判断字符串”是空字符串,则返回“否则字符串”。“否则字符串”可被省略而不会造成错误,但函数在“判断字符串”为空时便会返回空字符串。


这个函数首先判断参数1是否为空。如果参数1不为空,则输出参数2。如果参数1为空或只包含空白内容(空格、换行等),则输出参数3。
if函数还可用在模板语法中检查某个参数是否被使用。若满足条件,可在调用此模板的页面中显示或不显示特定内容。
<pre>-{}-
{{#if:{{{1|}}}|匿名参数1不为空时输出的结果|匿名参数1为空时输出的结果}}
{{#if:{{{xx|}}}{{{yy|}}}|xx或yy参数不为空时输出的结果|xx和yy参数都为空时输出的结果}}
</pre>


:<syntaxhighlight lang="moin" inline>{{#if: | yes | no}}</syntaxhighlight> → '''{{#if: | yes | no}}'''
=== <tt>ifeq</tt> ===
:<syntaxhighlight lang="moin" inline>{{#if: string | yes | no}}</syntaxhighlight> → '''{{#if: string | yes | no}}'''
<code>ifeq</code>比较两个字符串,返回比较结果。语法为:
:<code><nowiki>{{#if: &nbsp;&nbsp;&nbsp;&nbsp; | yes | no}}</nowiki></code> → '''{{#if: | yes | no}}'''
:<code><nowiki>{{#if: </nowiki><br><br><br><nowiki> | yes | no}}</nowiki></code> → '''{{#if:


| yes | no}}'''
<pre>-{}-
{{#ifeq:字符串1|字符串2|相等时返回的字符串|不相等时返回的字符串}}
</pre>


字符串内容会被处理为纯文本,因此不会计算数学表达式(参见[[##ifexpr|#ifexpr]]):
注意:两个空字符串是相等的。


:<syntaxhighlight lang="moin" inline>{{#if: 1==2 | yes | no }}</syntaxhighlight> → '''{{#if: 1==2 | yes | no}}'''
示例:
:<syntaxhighlight lang="moin" inline>{{#if: 0 | yes | no }}</syntaxhighlight> → '''{{#if: 0 | yes | no }}'''


最后一个参数(false)可以忽略:
假设模板{{tlc|Ifeq test}}的内容是


:<syntaxhighlight lang="moin" inline>{{#if: foo | yes }}</syntaxhighlight> → ''' {{#if: foo | yes }}'''
<pre>
:<syntaxhighlight lang="moin" inline>{{#if: | yes }}</syntaxhighlight> → ''' {{#if: | yes }}'''
{{#ifeq:{{{lang}}}|zh|我使用中文|I don't use Chinese}}
:<syntaxhighlight lang="moin" inline>{{#if: foo | | no}}</syntaxhighlight> → ''' {{#if: foo | | no}}'''
</pre>


该函数可嵌套。为了做到这一点,嵌套内层的#if函数需要按规则完整填写所有参数以符合#if的参数形式。一般至多可嵌套7层,该数也可能为wiki自身限制和内存限制而有变动。
则{{tlc|Ifeq test|lang{{=}}zh}}的结果是“我使用中文”;而{{tlc|Ifeq test|lang{{=}}en}}的结果是“I don't use Chinese”。
:{{tmpl|0=<code><nowiki>{{</nowiki>#if: ''$1'' {{!}} ''$2'' {{!}} <nowiki>{{</nowiki>#if: ''$1'' {{!}} ''$2'' {{!}} ''$3'' <nowiki>}} }}</nowiki></code>
|1=测试字符串
|2=字符串非空时的值
|3=字符串为空(或只有空格)的值
}}


你可以在<code>#if</code>条件句中以字符串变量代替测试字符串。在这里,你需要在变量名的后面加上<code>|</code>(分隔符)以正确引用字符串。
=== <tt>ifexist</tt> ===
(因此如果参数没有值,则计算结果为一个空字符串而非"<code><nowiki>{{{1}}}</nowiki></code>"。)
<code>ifexist</code>根據指定名稱的頁面是否存在,返回兩個參數中的一個。用法:


:{{tmpl|0=<code class="mw-highlight"><!--
<pre>-{}-
-->{{((}}#if:{{#tag:span|{{(((}}|class=nb}}{{#tag:span|1|class=cp}}{{red|{{!}}}}{{#tag:span|{{)))}}|class=nb}}{{!}}$1{{!}}$2{{))}}<!--
{{#ifexist:待測頁面標題|存在文字|不存在文字}}
</pre>
--></code>
|1=你在变量1里面输入了文本
|2=变量1里面没有文本
}}


参见[[mw:Help:Parser functions in templates]]以了解更多关于解析器函数中变量的相关例子。
注意不能跨维基使用。


{{Anchor|ifeq|IFEQ|Ifeq|IfEq|If equal}}
<code>ifexist</code>是一个高开销方法,如果超过调用次数限制,超出部分的调用默认为输出不存在时的内容。


== #ifeq ==
示例:
这个函数判断两个輸入字符串是否相同,並根據結果輸出兩個字符串的其中一個。
如果需要更多的比較和輸出字符串,請考慮使用<code>#switch</code>。


:<code><nowiki>{{#ifeq:</nowiki> ''string 1'' <nowiki>|</nowiki> ''string 2'' <nowiki>|</nowiki> ''value if identical'' <nowiki>|</nowiki> ''value if different'' <nowiki>}}</nowiki></code>
首先,我们已经知道[[test]]页面不存在,[[User:用户名]]不存在,[[中国]]页面存在。
* {{tlxm|#ifexist|test|有test頁面|無test頁面}} → {{#ifexist:test|有test頁面|無test頁面}}
* {{tlxm|#ifexist|User:用户名|該用戶頁存在|該用戶頁不存在}} → {{#ifexist:User:用户名|該用戶頁存在|該用戶頁不存在}}
* {{tlxm|#ifexist|中国|'''✓'''|'''✗'''}} → {{#ifexist:中国|'''✓'''|'''✗'''}}


如果两个字符串均为数字,则函数会进行数值的比较:
=== <tt>ifexpr</tt> ===
<code>ifexpr</code>计算数学表达式,并根据计算结果返回字符串。


:<syntaxhighlight lang="moin" inline>{{#ifeq: 01 | 1 | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: 01 | 1 | equal | not equal}}'''
<pre>-{}-
:<syntaxhighlight lang="moin" inline>{{#ifeq: 0 | -0 | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: 0 | -0 | equal | not equal}}'''
{{#ifexpr:表达式|表达式不为0的结果|表达式为0的结果}}
:<syntaxhighlight lang="moin" inline>{{#ifeq: 1e3 | 1000 | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: 1e3 | 1000 | equal | not equal}}'''
</pre>
:<syntaxhighlight lang="moin" inline>{{#ifeq: {{#expr:10^3}} | 1000 | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: {{#expr:10^3}} | 1000 | equal | not equal}}'''


否则,函数会进行文本的比较(大小写敏感):
表达式语法与<code>expr</code>相同。


:<syntaxhighlight lang="moin" inline>{{#ifeq: foo | bar | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: foo | bar | equal | not equal}}'''
=== <tt>switch</tt> ===
:<syntaxhighlight lang="moin" inline>{{#ifeq: foo | Foo | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: foo | Foo | equal | not equal}}'''
<code>switch</code>将一个值与多个预设值比较,若有匹配时则返回指定字符串,即[[双射]]。语法是:
:<syntaxhighlight lang="moin" inline>{{#ifeq: "01" | "1" | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: "01" | "1" | equal | not equal}}''' &nbsp;''(对比上面没有引号的例子)''
:<syntaxhighlight lang="moin" inline>{{#ifeq: 10^3 | 1000 | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: 10^3 | 1000 | equal | not equal}}''' &nbsp;''(对比上面带有<code>[[##expr|#expr]]</code>的例子,會先回傳一個有效的整數)''


作为例子,考虑一个已存在的模板<code>Template:Timer</code>,该模板利用解析器来選擇兩個標準時間,short和long。
<pre>-{}-
它以参数作为第一个输入来比较字符串“short”&ndash;这没有约定顺序,但是如果参数在第一个则更容易理解。
{{#switch:比较值
模板代码定义为:
|预设值1 = 结果1

|预设值2 = 结果2
:<syntaxhighlight lang="moin" inline>{{#ifeq: {{{1|}}} | short | 20 | 40 }}</syntaxhighlight>
|...

|预设值n = 结果n
|#default = 缺省结果
会产生如下结果

:<syntaxhighlight lang="moin" inline>{{timer|short}}</syntaxhighlight> → '''20'''
:<syntaxhighlight lang="moin" inline>{{timer|20}}</syntaxhighlight> → '''40'''
:<syntaxhighlight lang="moin" inline>{{timer}}</syntaxhighlight> → '''40'''

{{Warning|1=任何的解析器标签和其它的解析器函数,用在解析器函数中时,都一定会被一个临时生成的独一无二的标识码替代。这会影响如下比较:

:<code><nowiki>{{#ifeq: &lt;nowiki>foo&lt;/nowiki> | &lt;nowiki>foo&lt;/nowiki> | equal | not equal}}</nowiki></code> → '''{{#ifeq: <nowiki>foo</nowiki> | <nowiki>foo</nowiki> | equal | not equal}} '''
:<code><nowiki>{{#ifeq: &lt;math>foo&lt;/math> | &lt;math>foo&lt;/math> | equal | not equal}}</nowiki></code> → '''{{#ifeq: <math>foo</math> | <math>foo</math> | equal | not equal}} '''
:<code><nowiki>{{#ifeq: {{</nowiki>#tag:<nowiki>math|foo}} | {{#tag:math|foo}} | equal | not equal}}</nowiki></code> → '''{{#ifeq: {{#tag:math|foo}} | {{#tag:math|foo}} | equal | not equal}} '''
:<syntaxhighlight lang="moin" inline>{{#ifeq: [[foo]] | [[foo]] | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: [[foo]] | [[foo]] | equal | not equal}} '''

如果被比较的字符串由相等的模板调用提供,且模板包含这些标签,则条件视为真,但如果是两个不同的模板,即使有包含这些内容的相同内容,也是视为假。
}}
}}
</pre>


{{Warning|1=随网站配置的变化,含有页面名字的魔术字的字符串的字面比较可能会发生错误。 比如说,<nowiki>{{FULLPAGENAME}}</nowiki>这一魔术字随wiki的变化,可能在返回时使开头字母变成大写,也会用下划线替代空格。
<code>switch</code>将从左往右逐一尝试,直到出现匹配。函数将返回第一个匹配值对应的结果,而忽略后面的匹配值。如果没有匹配,函数将返回缺省结果。缺省结果是指的#default=后面的内容。其中#default=在结果不包含等号时是可以省略的。如果缺省结果没有设置,函数将返回空串。


为了解决这个问题,将这个魔术字应用到两个参数上:
注意:“缺省结果”是'''最后一个没有等号'''的预设值或“#default”预设值对应的结果;如果期望把一个包含“=”号的字符串作为缺省结果,则必须采用“#default”预设值形式。例如:


:<syntaxhighlight lang="moin" inline>{{#ifeq: {{FULLPAGENAME: L'Aquila}} | {{FULLPAGENAME}} | equal | not equal}}</syntaxhighlight> → '''equal'''
<pre>#default = <span style="color:red;">red</span></pre>
}}


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


这个函数接收一个输入字符串,返回两个结果中的一个。如果输入字符串包含一个由其他解析器函数(比如<code>[[##expr|#expr]]</code>、<code>[[##time|#time]]</code>和<code>[[##rel2abs|#rel2abs]]</code>)、[[Special:MyLanguage/Help:Templates|模板]]错误(比如模板循环和模板递归)或其他解析器“软错误”生成的<code>class="error"</code>的HTML对象,那么视为真。
<pre>-{}-

{{#switch:比较值
:<code><nowiki>{{#iferror:</nowiki> ''test string'' <nowiki>|</nowiki> ''value if error'' <nowiki>|</nowiki> ''value if correct'' <nowiki>}}</nowiki></code>
|预设值1

|预设值2
待返回字符串参数可以省略。若省略<code>"correct"</code>(正确)字符串参数,则在<code>"test string"</code>(测试字符串)不出错的情况下函数将返回被测字符串本身。若省略<code>"error"</code>(错误)字符串参数,则函数将在被测字符串出错时返回空字符串:
|预设值3 = 结果3

|缺省结果
:<syntaxhighlight lang="moin" inline>{{#iferror: {{#expr: 1 + 2 }} | error | correct }}</syntaxhighlight> → '''{{#iferror: {{#expr: 1 + 2 }} | error | correct }}'''
:<syntaxhighlight lang="moin" inline>{{#iferror: {{#expr: 1 + X }} | error | correct }}</syntaxhighlight> → '''{{#iferror: {{#expr: 1 + X }} | error | correct }}'''
:<syntaxhighlight lang="moin" inline>{{#iferror: {{#expr: 1 + 2 }} | error }}</syntaxhighlight> → '''{{#iferror: {{#expr: 1 + 2 }} | error }}'''
:<syntaxhighlight lang="moin" inline>{{#iferror: {{#expr: 1 + X }} | error }}</syntaxhighlight> → '''{{#iferror: {{#expr: 1 + X }} | error }}'''
:<syntaxhighlight lang="moin" inline>{{#iferror: {{#expr: 1 + 2 }} }}</syntaxhighlight> → '''{{#iferror: {{#expr: 1 + 2 }} }}'''
:<syntaxhighlight lang="moin" inline>{{#iferror: {{#expr: 1 + X }} }}</syntaxhighlight> → '''&zwnj;{{#iferror: {{#expr: 1 + X }} }}'''<!-- maybe the zwnj protects the trailing space before no output -->
:<syntaxhighlight lang="moin" inline>{{#iferror: {{#expr: . }} | error | correct }}</syntaxhighlight> → '''{{#iferror: {{#expr: . }} | error | correct }}'''
:<syntaxhighlight lang="moin" inline>{{#iferror: <strong class="error">a</strong> | error | correct }}</syntaxhighlight> → '''{{#iferror: <strong class="error">a</strong> | error | correct }}'''
Some errors may cause a tracking category to be added, using <code><nowiki>{{#iferror:}}</nowiki></code> will not suppress the addition of the category.

== #ifexpr ==

此函数会判断数学表达式并根据其布尔值结果返回对应的字符串:

:<code><nowiki>{{#ifexpr:</nowiki> ''expression'' <nowiki>|</nowiki> ''value if true'' <nowiki>|</nowiki> ''value if false'' <nowiki>}}</nowiki></code>

这里<code>"expression"</code>输入串将原封不动的作为上面<code>[[##expr|#expr]]</code>的参数进行调用,且表达式运算符是通用的,返回值也将作为布尔表达式进行处理。

输入表达式为空时将视为<code>false</code>:

:<syntaxhighlight lang="moin" inline>{{#ifexpr: | yes | no}}</syntaxhighlight> → '''{{#ifexpr: | yes | no}}'''

如上面所提,0将视为<code>false</code>,非零值将视为<code>true</code>,因此这个函数与下面的仅用<code>[[##ifeq|#ifeq]]</code>和<code>[[##expr|#expr]]</code>的表述等价:

:<code><nowiki>{{#ifeq: {{#expr: </nowiki>''expression''<nowiki> }} | 0 | </nowiki> ''value if false'' <nowiki>|</nowiki> ''value if true'' <nowiki>}}</nowiki></code>

除了下面这种情况:所输入表达式为空或者是一个错误表达式(空串会返回一条错误信息,而它不等于0,所以在后者我们会得到<code>"value if true"</code>)。

:<syntaxhighlight lang="moin" inline>{{#ifexpr: = | yes | no }}</syntaxhighlight> → ''' {{#ifexpr: = | yes | no }}'''

相对的

:<syntaxhighlight lang="moin" inline>{{#ifeq: {{#expr: = }} | 0 | no | yes }}</syntaxhighlight> → ''' {{#ifeq: {{#expr: = }} | 0 | no | yes }}'''

两个返回值都可以省略,当合适的对应分支被省略时,函数不输出:

:<syntaxhighlight lang="moin" inline>{{#ifexpr: 1 > 0 | yes }}</syntaxhighlight> → '''{{#ifexpr: 1 > 0 | yes }}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 1 < 0 | yes }}</syntaxhighlight> → ''' {{#ifexpr: 1 < 0 | yes }}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 0 = 0 | yes }}</syntaxhighlight> → ''' {{#ifexpr: 0 = 0 | yes }}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 1 > 0 | | no}}</syntaxhighlight> → ''' {{#ifexpr: 1 > 0 | | no}}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 1 < 0 | | no}}</syntaxhighlight> → ''' {{#ifexpr: 1 < 0 | | no}}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 1 > 0 }}</syntaxhighlight> → ''' {{#ifexpr: 1 > 0 }}'''

Boolean operators of equality or inequality operators are supported.

:<syntaxhighlight lang="moin" inline>{{#ifexpr: 0 = 0 or 1 = 0 | yes}}</syntaxhighlight> → '''{{#ifexpr: 0 = 0 or 1 = 0 | yes}}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 0 = 0 and 1 = 0 | | no}}</syntaxhighlight> → '''{{#ifexpr: 0 = 0 and 1 = 0 | | no}}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 2 > 0 or 1 < 0 | yes}}</syntaxhighlight> → '''{{#ifexpr: 2 > 0 or 1 < 0 | yes}}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 2 > 0 and 1 > 0 | yes | no}}</syntaxhighlight> → '''{{#ifexpr: 2 > 0 and 1 > 0 | yes | no}}'''

{{Warning|1=使用<code>[[##ifexpr|#ifexpr]]</code>进行数字比较的结果不总是与<code>#ifeq</code>和<code>[[##switch|#switch]]</code>的结果一致。 后面两种比较相对于<code>[[##ifexpr|#ifexpr]]</code>而言更加精确,因而未必返回相同结果。
考虑比较下面两个仅有最后一位数不同的数:

:<syntaxhighlight lang="moin" inline>{{#ifeq: 12345678901234567 | 12345678901234568 | equal | not equal}}</syntaxhighlight> → '''{{#ifeq: 12345678901234567 | 12345678901234568 | equal | not equal}}'''
:<syntaxhighlight lang="moin" inline>{{#switch: 12345678901234567 | 12345678901234568 = equal | not equal}}</syntaxhighlight> → '''{{#switch: 12345678901234567 | 12345678901234568 = equal | not equal}}'''

因为<code>#ifeq</code>和<code>[[##switch|#switch]]</code>使用的PHP会比较两个整数类型的数,会正确返回预期结果。
然而用<code>[[##ifexpr|#ifexpr]]</code>比较相同的两个数时:

:<syntaxhighlight lang="moin" inline>{{#ifexpr: 12345678901234567 = 12345678901234568 | equal | not equal}}</syntaxhighlight> → '''{{#ifexpr: 12345678901234567 = 12345678901234568 | equal | not equal}}'''

对于不同的数字,结果实际上是不正确的。
造成<code>[[##ifexpr|#ifexpr]]</code>出错行为的原因是MediaWiki将两个数依字面表达理解成了浮点数,而对于像这样的大数,转换为浮点数由于精度误差会存储为一样的数值,导致出错。<br><br>
}}
}}
</pre>


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


== #ifexist ==
<code>switch</code>也可以与<code>invoke</code>搭配,来完成随机显示的功能,详见'''[[Help:隨機顯示]]'''。


这个函数将一组字符串作为输入,并翻译成页面标题,然后根据在本地wiki上是否存在该页面而返回对应的值。
=== <tt>time</tt> ===
<code>time</code>是一个时间日期格式化函数,它的语法为:


:<code><nowiki>{{#ifexist:</nowiki> ''page title'' | ''value if exists'' | ''value if doesn't exist'' <nowiki>}}</nowiki></code>
<pre>-{}-
{{#time:格式参数}}
</pre>


只要页面存在就会判定为<code>true</code>(真值),即便那个页面看上去是空白的(比如像是分类链接或者是魔术字解释页之类的却不包含任何可视内容的页面),或者是重定向页,或者它就是空白页。当且仅当页面是红链时判定为<code>false</code>(假值),包括那些曾经存在却被删除的页面。
或者


:<code><nowiki>{{#ifexist:</nowiki> {{FULLPAGENAME}} | exists | doesn't exist <nowiki>}}</nowiki></code> → '''{{#ifexist: {{FULLPAGENAME}} | exists | doesn't exist }}'''
<pre>-{}-
:<code><nowiki>{{#ifexist:</nowiki> XX{{FULLPAGENAME}}XX | exists | doesn't exist <nowiki>}}</nowiki></code> → '''{{#ifexist: XX{{FULLPAGENAME}}XX | exists | doesn't exist }}'''
{{#time:格式参数|时间参数}}
</pre>


函数在系统消息被自定义时返回<code>true</code>,对特殊页面的判定则取决于本地软件自身。
如果'''时间参数'''未指定,则使用该条目被转换为HTML的时间(值)。注意到由于缓存的缘故,这与条目被浏览的时间可能会有高达1星期的偏差。因此可能需要手工更新,方法是加上action=purge参数访问页面。


:<code><nowiki>{{#ifexist:</nowiki> {{#special:Watchlist}} | exists | doesn't exist <nowiki>}}</nowiki></code> → '''{{#ifexist: Special:Watchlist | exists | doesn't exist }}'''
'''格式参数'''是一种格式字符,与在[http://php.net/date PHP的date]中的用法相似。
:<code><nowiki>{{#ifexist:</nowiki> {{#special:CheckUser}} | exists | doesn't exist <nowiki>}}</nowiki></code> → {{#ifexist: Special:Checkuser | '''exists''' (因为nsp=0扩展已经安装于此wiki) | '''doesn't exist''' (因为nsp=0未安装于此wiki) }}
:<syntaxhighlight lang="moin" inline>{{#ifexist: MediaWiki:Copyright | exists | doesn't exist }}</syntaxhighlight> → {{#ifexist: MediaWiki:Copyright | '''exists''' (因为[[{{ns:8}}:Copyright]]已自定义) | '''doesn't exist''' (因为[[{{ns:8}}:Copyright]]未自定义) }}


如果一个页面使用了<code>#ifexist:</code>来检查目标页面,则这个检查页面将出现在被检查页面的[[{{#special:WhatLinksHere}}]]里。所以如果本页面({{FULLPAGENAME}})使用了代码 <code><nowiki>{{#ifexist:Foo}}</nowiki></code>,那么[[{{#special:WhatLinksHere}}/Foo]]将列出{{FULLPAGENAME}}。
下列格式代码与在PHP中的意义一样。所不同的是:如果時間未被指定,则显示文章最后一次被转换成HTML的时间。由于缓存的关系,此时间和你浏览文章的时间可能有最长一个星期的差别。所以有时可能需要人工更新数据,方法是编辑文章但不做任何修改即保存。


若wiki有其在使用的对应的共享媒体库,<code>#ifexist:</code>就可用于检查一个文件是否在媒体库中,而不仅仅只是在wiki本体上检查:
以下格式代码和PHP中<code>date()</code>函数意义相同。除了国际化(主要是语言)造成的差别以外,所有和PHP的不同点都应当作为软件的错误进行报告。其中所有的数字输出都会被替换成当地语言的时间格式,可以使用<code>xn</code>(见下文)恢复成显示原来的数字。

:<code><nowiki>{{#ifexist:</nowiki> {{ns:File}}:Example.png <nowiki>| exists | doesn't exist }}</nowiki></code> → '''{{#ifexist: {{ns:File}}:Example.png | exists | doesn't exist }}'''
:<code><nowiki>{{#ifexist:</nowiki> Image:Example.png <nowiki>| exists | doesn't exist }}</nowiki></code> → '''{{#ifexist: Image:Example.png | exists | doesn't exist }}'''
:<code><nowiki>{{#ifexist:</nowiki> {{ns:-2}}:Example.png <nowiki>| exists | doesn't exist }}</nowiki></code> → '''{{#ifexist: {{ns:-2}}:Example.png | exists | doesn't exist }}'''

如果文件有一个已创建的对应的本地描述页面,上面的结果将全部是'''exists'''。

<code>#ifexist:</code>不会对跨站链接起作用。

<span id="ifexist_limits"></span>
=== ifexist 限制 ===
<code>#ifexist:</code>被视为“高开销(expensive)解析器函数”,每个页面调用这类函数的次数(包括包含于嵌入式模板的函数)存在一个限制。
当达到该限制时,更多的<code>#ifexist:</code>函数,无论其目标页面是否存在,只会自动返回错误值false,且该页面会被分类到[[:Category:{{MediaWiki:expensive-parserfunction-category}}]]中。
追踪分类的名稱可能因您的wiki内容的语言而异。

一些情况下,在css中使用选择器<code>a.new</code>(以选出链接到不存在的页面的链接)或者是<code>a:not(.new)</code>(以选出已存在页面的链接),是可以达到模仿ifexist的效果的。
另外,<code>$wgExpensiveParserFunctionLimit</code>可以调整对高开销解析器函数数量的限制,如果有需要,也可以增加页面LocalSettings.php中的限制值。

<span id="ifexist_and_wanted_pages"></span>
=== ifexisit和需要的页面 ===
一个不存在的页面被#ifexist检测后会被计数在[[Special:MyLanguage/Manual:WantedPages|待创建页面]]中。

== #rel2abs ==
这个函数将文件的相对路径转换为绝对路径。

:<code><nowiki>{{#rel2abs:</nowiki> ''path'' <nowiki>}}</nowiki></code>
:<code><nowiki>{{#rel2abs:</nowiki> ''path'' <nowiki>|</nowiki> ''base path'' <nowiki>}}</nowiki></code>

在输入项<code>path</code>中,可以使用以下类型的句法:

*<code>.</code> → 本级路径
*<code>..</code> → 回到上一级
*<code>/foo</code> → 向下一级进入子目录/foo

若<code>base path</code>没有指定,将默认的填入函数所在页面的绝对路径:

:<code><nowiki>{{#rel2abs:</nowiki> /quok | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: /quok | {{ns:12}}:Foo/bar/baz }}'''
:<code><nowiki>{{#rel2abs:</nowiki> ./quok | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: ./quok | {{ns:12}}:Foo/bar/baz }}'''
:<code><nowiki>{{#rel2abs:</nowiki> ../quok | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: ../quok | {{ns:12}}:Foo/bar/baz }}'''
:<code><nowiki>{{#rel2abs:</nowiki> ../. | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: ../. | {{ns:12}}:Foo/bar/baz }}'''

无效语法,如<code>/.</code>或<code>/./</code>,将被忽略。
由于不允许超过两个连续的句号,因此可以使用诸如此类的序列来分隔连续的语句:

:<code><nowiki>{{#rel2abs:</nowiki> ../quok/. | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: ../quok/. | {{ns:12}}:Foo/bar/baz }}'''
:<code><nowiki>{{#rel2abs:</nowiki> ../../quok | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: ../../quok | {{ns:12}}:Foo/bar/baz }}'''
:<code><nowiki>{{#rel2abs:</nowiki> ../../../quok | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: ../../../quok | {{ns:12}}:Foo/bar/baz }}'''
:<code><nowiki>{{#rel2abs:</nowiki> ../../../../quok | {{ns:12}}:Foo/bar/baz <nowiki>}}</nowiki></code> → '''{{#rel2abs: ../../../../quok | {{ns:12}}:Foo/bar/baz }}'''

<span lang="en" dir="ltr" class="mw-content-ltr">For a similar group of functions see also [[Help:魔术字#URL data|Help:Magic words#URL data]].</span>
<span lang="en" dir="ltr" class="mw-content-ltr">Built-in parser functions include: 'localurl:', 'fullurl:', 'anchorencode:' etc.</span>

== #switch ==
该函数将一个输入值同若干个测试用例(test cases)做比较,如果找到匹配,返回有关联的字符串。

{{pre|1=
<nowiki>{{#switch:</nowiki> ''comparison string''
{{!}} ''case'' = ''result''
{{!}} ''case'' = ''result''
{{!}} ''...''
{{!}} ''case'' = ''result''
{{!}} ''default result''
<nowiki>}}</nowiki>
}}

例如:

:<syntaxhighlight lang="moin" inline>{{#switch: baz | foo = Foo | baz = Baz | Bar }}</syntaxhighlight> → ''' {{#switch: baz | foo = Foo | baz = Baz | Bar }} '''
:<syntaxhighlight lang="moin" inline>{{#switch: foo | foo = Foo | baz = Baz | Bar }}</syntaxhighlight> → ''' {{#switch: foo | foo = Foo | baz = Baz | Bar }} '''
:<syntaxhighlight lang="moin" inline>{{#switch: zzz | foo = Foo | baz = Baz | Bar }}</syntaxhighlight> → ''' {{#switch: zzz | foo = Foo | baz = Baz | Bar }} '''

含有部分嵌入包含标记的<nowiki>#</nowiki>switch会影响到能让不熟悉模板代码的编辑者查看和编辑可配置元素的配置文件。

<span id="Default"></span>
=== 默认 ===

如果<code>''comparison string''</code>不能与任何<code>''case''</code>匹配,则返回<code>''default result''</code>:

:<syntaxhighlight lang="moin" inline>{{#switch: test | foo = Foo | baz = Baz | Bar }}</syntaxhighlight> → ''' {{#switch: test | foo = Foo | baz = Baz | Bar }} '''

在这种语法中,默认返回值必须是函数的最后一个参数,而且不能包含原始等号(不帶<code><nowiki>{{}}</nowiki></code>的等號)。
否则,就会解析为样例比较,无匹配的样例时不显示文本。
这是因为默认值没有定义(是空的)。
如果有样例匹配,则返回关联的字符串。

:<syntaxhighlight lang="moin" inline>{{#switch: test | Bar | foo = Foo | baz = Baz }}</syntaxhighlight>&nbsp;→ ''' {{#switch: test | Bar | foo =Foo | baz =Baz }} '''<!-- do not remove the spaces between «''' {{» and «}} '''» -->
:<syntaxhighlight lang="moin" inline>{{#switch: test | foo = Foo | baz = Baz | B=ar }}</syntaxhighlight>&nbsp;→ ''' {{#switch: test | foo = Foo | baz = Baz | B=ar }} '''<!-- do not remove the spaces between «''' {{» and «}} '''» -->
:<syntaxhighlight lang="moin" inline>{{#switch: test | test = Foo | baz = Baz | B=ar }}</syntaxhighlight>&nbsp;→ ''' {{#switch: test | test = Foo | baz = Baz | B=ar }} '''<!-- do not remove the spaces between «''' {{» and «}} '''» -->

你也可以将<code>''case''</code>字符串设为''<code>#default</code>''从而清楚地声明默认值。

{{pre|1=
<nowiki>{{#switch:</nowiki> ''comparison string''
{{!}} ''case'' = ''result''
{{!}} ''case'' = ''result''
{{!}} ''...''
{{!}} ''case'' = ''result''
{{!}} #default = ''default result''
<nowiki>}}</nowiki>
}}

这种方式声明的默认结果可以放在函数的任何地方:

:<syntaxhighlight lang="moin" inline>{{#switch: test | foo = Foo | #default = Bar | baz = Baz }}</syntaxhighlight> → ''' {{#switch: test | foo = Foo | #default = Bar | baz = Baz }} '''

如果<code>"default"</code>参数被省略,且没有找到匹配,则不返回结果:

:<syntaxhighlight lang="moin" inline>{{#switch: test | foo = Foo | baz = Baz }}</syntaxhighlight> → ''' {{#switch: test | foo = Foo | baz = Baz }} '''<!-- do not remove the spaces between «''' {{» and «}} '''» -->

<span id="Grouping_results"></span>
=== 分组结果 ===

该函数允许有“跌落”值,多个<code>"case"</code>字符串返回相同的<code>"result"</code>字符串,从而减少重复。

{{pre|1=
<nowiki>{{#switch:</nowiki> ''comparison string''
{{!}} ''case1'' = ''result1''
{{!}} ''case2''
{{!}} ''case3''
{{!}} ''case4'' = ''result234''
{{!}} ''case5'' = ''result5''
{{!}} ''case6''
{{!}} ''case7'' = ''result67''
{{!}} #default = ''default result''
<nowiki>}}</nowiki>
}}

在本例中,第二、三、四个分支都会返回<code>"result234"</code>,第六和第七个分支都会返回<code>"result67"</code>。
上述案例中,最后一个参数中的“<code>#default = </code>”可以省略。

<span id="Use_with_parameters"></span>
=== 带有参数使用 ===
该函数允许将参数用作测试字符串。
在本例中,不必将管道符放在参数名称后面,因为你不太可能需要选择字符串“<code><nowiki>{{{</nowiki>''parameter name''<nowiki>}}}</nowiki></code>”作为样例。
((如果没有管道符,且参数不存在或没有值,则参数就会显示为这样。)
参见[[mw:Help:Parser functions in templates|Help:Parser functions in templates]]。)

:<syntaxhighlight lang="moin" inline>{{#switch: {{{1}}} | foo = Foo | baz = Baz | Bar }}</syntaxhighlight>

上面的例子中,如果<code><nowiki>{{{1}}}</nowiki></code>等于<code>foo</code>,函数返回<code>Foo</code>。
如果等于<code>baz</code>,函数返回<code>Baz</code>。
如果参数是空的或者不存在,函数返回<code>Bar</code>。

上面的这些中,也可以将样例组合起来以返回单个结果。

:<syntaxhighlight lang="moin" inline>{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | Bar }}</syntaxhighlight>

如果<code><nowiki>{{{1}}}</nowiki></code>等于<code>foo</code>、<code>zoo</code>或<code>roo</code>,函数返回<code>Foo</code>。
如果等于<code>baz</code>,函数返回<code>Baz</code>。
如果参数是空的或者不存在,函数返回<code>Bar</code>。

而且,如果你希望在测试参数不能匹配任何样例时不返回任何内容,可以省略默认结果。

:<syntaxhighlight lang="moin" inline>{{#switch: {{{1}}} | foo = Foo | bar = Bar }}</syntaxhighlight>

在本例中,如果<code><nowiki>{{{1}}}</nowiki></code>存在且等于<code>foo</code>或<code>bar</code>,则分别返回<code>Foo</code>或<code>Bar</code>,否则不返回任何内容。

这样做相当于将默认值声明为空。

:<syntaxhighlight lang="moin" inline>{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | }}</syntaxhighlight>

如果由于某些原因需要将样例设置为<code><nowiki>{{{</nowiki>''parameter name''<nowiki>}}}</nowiki></code>,则函数在参数不存在或没有值的情况下返回该样例的结果。
参数需要存在且拥有不同于字符串“<code><nowiki>{{{</nowiki>''parameter name''<nowiki>}}}</nowiki></code>”的值以返回函数的默认结果。

:(若<code><nowiki>{{{1}}}</nowiki></code>不存在或者是空的):
::<syntaxhighlight lang="moin" inline>{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }}</syntaxhighlight> → ''' Foo '''
:(若<code><nowiki>{{{1}}}</nowiki></code>的值为<code>test</code>):
::<syntaxhighlight lang="moin" inline>{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }}</syntaxhighlight> → ''' Bar '''
:(若<code><nowiki>{{{1}}}</nowiki></code>的值为“<code><nowiki>{{{1}}}</nowiki></code>”):
::<syntaxhighlight lang="moin" inline>{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }}</syntaxhighlight> → ''' Foo '''


在这样的例子中,你需要给参数添加管道符(<code><nowiki>{{{1</nowiki><span style="color:red; font-weight:bold">|</span><nowiki>}}}</nowiki></code>)。

<span id="Comparison_behavior"></span>
=== 比较行为 ===

如同<code>[[##ifeq|#ifeq]]</code>那样,若被比较字符串和测试用例字符串都是数字,那么按照数值进行比较;反之若存在一个非纯数字串,都会按照字符串比较规则进行:

:<syntaxhighlight lang="moin" inline>{{#switch: 0 + 1 | 1 = one | 2 = two | three}}</syntaxhighlight>&nbsp;→ '''{{#switch: 0 + 1 | 1 = one | 2 = two | three}}'''
:<syntaxhighlight lang="moin" inline>{{#switch: {{#expr: 0 + 1}} | 1 = one | 2 = two | three}}</syntaxhighlight>&nbsp;→ '''{{#switch: {{#expr: 0 + 1}} | 1 = one | 2 = two | three}}'''

:<syntaxhighlight lang="moin" inline>{{#switch: a | a = A | b = B | C}}</syntaxhighlight>&nbsp;→ '''{{#switch: a | a = A | b = B | C}}'''
:<syntaxhighlight lang="moin" inline>{{#switch: A | a = A | b = B | C}}</syntaxhighlight>&nbsp;→ '''{{#switch: A | a = A | b = B | C}}'''

<code>''case''</code>字符串可以是空的:

:<syntaxhighlight lang="moin" inline>{{#switch: | = Nothing | foo = Foo | Something }}</syntaxhighlight> → '''{{#switch: | = Nothing | foo = Foo | Something }}'''

只要找到一个匹配,后面的<code>''case''</code>都会忽略:

:<syntaxhighlight lang="moin" inline>{{#switch: b | f = Foo | b = Bar | b = Baz | }}</syntaxhighlight> → '''{{#switch: b | f = Foo | b = Bar | b = Baz | }}'''

{{Warning|1=
<code>#switch</code>和<code>#ifeq</code>的数值比较结果未必一致(参见上面<code>#ifeq</code>部分):

:<syntaxhighlight lang="moin" inline>{{#switch: 12345678901234567 | 12345678901234568 = A | B}}</syntaxhighlight>&nbsp;→ '''{{#switch: 12345678901234567 | 12345678901234568 = A | B}}'''
:<syntaxhighlight lang="moin" inline>{{#ifexpr: 12345678901234567 = 12345678901234568 | A | B}}</syntaxhighlight>&nbsp;→ '''{{#ifexpr: 12345678901234567 = 12345678901234568 | A | B}}'''
}}

<span id="Raw_equal_signs"></span>
=== 原始等号 ===

“case”字符串不能包含原始等号。如果需要在比较串中加入等号,可以使用仅包含一个等号的模板{{tl|{{=}}}}来代替<code>=</code>,或者是用HTML标识码<code><nowiki>&amp;#61;</nowiki></code>来代替。

例如:


{| class="wikitable"
{| class="wikitable"
! 您输入的
! 代码 !! 描述 !! 输出(示例)
! 您输出的
|-
|-
| <syntaxhighlight lang=moin>
| <code>d</code> || 一个月中的第 n 天,不足两位补充0 || 04
{{#switch: 1=2
| 1=2 = raw
| 1<nowiki>=</nowiki>2 = nowiki
| 1{{=}}2 = template
| default
}}
</syntaxhighlight>
| '''{{#switch: 1=2 | 1=2 = raw | 1<nowiki>=</nowiki>2 = nowiki | 1{{=}}2 = template | default }}'''
|-
|-
| <syntaxhighlight lang=moin>
| <code>D</code> || 星期的缩写,通常不国际化 || {{#time:D}}
{{#switch: 1=2
| 1&#61;2 = html
| default
}}
</syntaxhighlight>
| '''{{#switch: 1=2 | 1&#61;2 = html | default }}'''
|}

<span id="Replacing_#ifeq"></span>
=== 替换#ifeq ===

<code>#switch</code>可以用于减少[[Special:MyLanguage/Help:Expansion depth|扩展深度]]。

例如:

* <syntaxhighlight lang="moin" inline>{{#switch:{{{1}}} |condition1=branch1 |condition2=branch2 |condition3=branch3 |branch4}}</syntaxhighlight>

等效于

* <syntaxhighlight lang="moin" inline>{{#ifeq:{{{1}}}|condition1 |branch1 |{{#ifeq:{{{1}}}|condition2 |branch2 |{{#ifeq:{{{1}}}|condition3 |branch3 |branch4}}}}}}</syntaxhighlight>

也就是线性的深度迭代判断:

<syntaxhighlight lang="xml">
{{#ifeq:{{{1}}}|condition1
|<!--then-->branch1
|<!--else-->{{#ifeq:{{{1}}}|condition2
|<!--then-->branch2
|<!--else-->{{#ifeq:{{{1}}}|condition3
|<!--then-->branch3
|<!--else-->branch4}}}}}}
</syntaxhighlight>

另一方面,对于嵌套在两个分支中的if(以缩进形式呈现,两侧都缩进),替换成switch可能很复杂/不切实际,从而形成对称树:

<syntaxhighlight lang="xml">
{{#ifeq:{{{1}}}|condition1
|<!--then-->branch1t{{
#ifeq:{{{1}}}|condition2
|<!--then-->branch1t2t{{#ifeq:{{{1}}}|condition4|<!--then-->branch1t2t4t|<!--else-->branch1t2t4e}}
|<!--else-->branch1t2e{{#ifeq:{{{1}}}|condition5|<!--then-->branch1t2e5t|<!--else-->branch1t2e5e}}
}}
|<!--else-->branch1e{{#ifeq:{{{1}}}|condition3
|<!--then-->branch1e3t{{#ifeq:{{{1}}}|condition6|branch1e3t6t|branch1e3t6e}}
|<!--else-->branch1e3e{{
#ifeq:{{{1}}}|condition7
|branch1e3e7t
|branch1e3e7t
}}
}}
}}
</syntaxhighlight>

{{Anchor|time|TIME}}
== #time ==
{| class="wikitable plainlinks" style="float: right; font-size: 90%; line-height: normal; margin-{{dir|{{pagelang}}|right|left}}: 1em; "
|-
|-
! 代码
| <code>j</code> || 一个月中的第 n 天,不足两位不补0 || 3
! 描述
! 当前输出<br><small class="noprint">([{{fullurl:Help:解析器函数|action=purge}} 刷新此页面的缓存]以更新)</small>
|-
|-
! colspan="3"| 年
| <code>l</code> || 星期的全称,通常不国际化 || {{#time:l}}
|-
|-
| style="text-align: center;" | <code>Y</code>
| <code>F</code> || 月份的的全称,通常需要国际化 || {{#time:F}}
| 4位数年。
| style="text-align: center;" | {{#time:Y}}
|-
|-
| style="text-align: center;" | <code>y</code>
| <code>m</code> || 数字表示的月份,不足两位补充0 || 01-12
| 2位数年。
| style="text-align: center;" | {{#time:y}}
|-
|-
| style="text-align: center;" | <code>L</code>
| <code>M</code> || 月份的的缩写,通常需要国际化 || {{#time:M}}
| 如果是闰年则为1,否则为0。
| style="text-align: center;" | {{#time:L}}
|-
|-
| style="text-align: center;" | <code>o</code>
| <code>n</code> || 数字表示的月份,不足两位不补0 || 1-12
| 指定周的ISO-8601年。{{#tag:ref|这拥有与Y相同的值,除了当ISO周数(W)属于去年或明年时,会改用那一年。|group=note}}
| style="text-align: center;" | {{#time:o}}{{#tag:ref|如果未满足注释1,将输出文字“o”。|group=note}}
|-
|-
| colspan="3" style="font-size: 88%;" |<references group="note"/>
| <code>Y</code> || 四位年份 || {{#time:Y}}
|-
|-
! colspan="3"| 月
| <code>y</code> || 二位年份 || {{#time:y}}
|-
|-
| style="text-align: center;" | <code>n</code>
| <code>H</code> || 小时,不足两位补充0 || 00-23
| 月指数,非零填充。
| style="text-align: center;" | {{#time:n}}
|-
|-
| style="text-align: center;" | <code>m</code>
| <code>i</code> || 分钟,不足两位补充0 || 00-59
| 月指数,零填充。
| style="text-align: center;" | {{#time:m}}
|-
|-
| style="text-align: center;" | <code>M</code>
| <code>s</code> || 秒,不足两位补充0 || 00-59
| 月名的缩写,使用网站语言。
|}
| style="text-align: center;" | {{#time:M}}

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

{| class="wikitable"
! 代码 !! 描述
|-
|-
| style="text-align: center;" | <code>F</code>
| <code>xn</code> || 将接下来的数字代码恢复成[[ASCII]]中的阿拉伯数字例如,在[[印地语]]中,{{tlxm|#time|H, xnH}}输出“०६, 06”。
| 使用网站语言的完整月名。
| style="text-align: center;" | {{#time:F}}
|-
|-
| style="text-align: center;" | <code>xg</code>
| <code>xr</code> || 将接下来的数字代码显示成罗马数字。
| 不同于[[主格|主格]]形式,以[[所有格|所有格]]形式返回月份名的全称。这个代码适用大多数的[[斯拉夫语言|斯拉夫语言]],比如波兰语、俄语、白俄罗斯语、捷克语、斯洛伐克语、斯洛文尼亚语、乌克兰语等。
| style="line-height: 1.6;" | 波兰语:<br><code style="font-size: 85%;"><nowiki>{{#time:F Y|June 2010|pl}}</nowiki></code> → {{#time:F Y|June 2010|pl}}<br>(主格)<br><code style="font-size: 85%;"><nowiki>{{#time:d xg Y|20 June 2010|pl}}</nowiki></code> → {{#time:d xg Y|20 June 2010|pl}}<br>(所有格)
|-
|-
! colspan="3"| 一年或一个月内的第几天
| <code>xg</code> || 输出月份名字的[[属格]],只针对那些区分主格和属格的语言。
|-
|-
| <code>xx</code> || 输出“x”。
| style="text-align: center;" | <code>j</code>
| 月内的第几天,没有前缀零。
|}
| style="text-align: center;" | {{#time:j}}
任何其他字符都将不做处理直接输出。你也可以用引号来输出未经处理的字符串。

* 引号中的字符直接输出(但不输出引号),没有配对的引号也直接输出。例如:
** {{tlxm|#time|"现在是"F}} → {{#time:"现在是"F}}
** {{tlxm|#time|i's"}} → {{#time:i's"}}
** {{tlxm|#time|Y-m-d"T"H:i:s"Z"}} → {{#time:Y-m-d"T"H:i:s"Z"}} ([[ISO 8601]])
* 像PHP的<code>date()</code>函数一样的反斜杠转义也是支持的。<code>\H</code>直接输出<code>H</code>,<code>\"</code>直接输出<code>"</code>。

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

时间参数的格式参照PHP的<code>strtotime()</code>函数。它同时支持相对时间,如"+10 hours",用来表示时区转换。更多信息参见[http://www.gnu.org/software/tar/manual/html_node/tar_109.html the GNU tar manual]{{dead link}}。

下表以國際協調时间(UTC){{#time:Y年n月j日(l)H時i分s秒}}(北京時間{{#time:Y年n月j日(l)H時i分s秒|+8 hours}})为例说明各格式参数的作用。

{| class="wikitable"
! 格式参数 !! 说明 !! 显示结果
|-
|-
| style="text-align: center;" | <code>d</code>
| <code>A</code> || 显示AM或PM || {{#time:A}}
| 月内的第几天,用前缀零填满两位。
| style="text-align: center;" | {{#time:d}}
|-
|-
| style="text-align: center;" | <code>z</code>
| <code>a</code> || 显示am或pm || {{#time:a}}
| 年内的第几天(一月一日视为第0天)。<br>{{memo|要获得ISO日期值请在此数基础上加1。}}
| style="text-align: center;" | {{#time:z}}
|-
|-
! colspan="3"| 周,以及周内的第几天
| <code>c</code> || 显示长日期 || {{#time:c}}
|-
|-
| style="text-align: center;" | <code>W</code>
| <code>D</code> || 星期数,以一个汉字显示 || {{#time:D}}
| ISO 8601周数,有前缀零。
| style="text-align: center;" | {{#time:W}}
|-
|-
| style="text-align: center;" | <code>N</code>
| <code>d</code> || 日期日数,有0补齐 || {{#time:d}}
| ISO 8601 一周中的某天(星期一为1, 星期日为7)。
| style="text-align: center;" | {{#time:N}}
|-
|-
| style="text-align: center;" | <code>w</code>
| <code>F</code>或<code>M</code> || 月份 || {{#time:F}}
| 一周内的某天(星期日为0,星期六为6)。
| style="text-align: center;" | {{#time:w}}
|-
|-
| style="text-align: center;" | <code>D</code>
| <code>G</code>或<code>g</code> || 当前UTC时间小时数,1位或2位数字 || {{#time:G}}
| 星期几的简写。很少国际化。
| style="text-align: center;" | {{#time:D}}
|-
|-
| style="text-align: center;" | <code>l</code>
| <code>H</code> || 小时数,2位数字(24小时制) || {{#time:H}}
| 星期几的全称。很少国际化。
| style="text-align: center;" | {{#time:l}}
|-
|-
! colspan="3"| 小时
| <code>h</code> || 小时数,2位数字 (12小时制)|| {{#time:h}}
|-
|-
| style="text-align: center;" | <code>a</code>
| <code>i</code> || 分钟数,2位数字 || {{#time:i}}
| 上午(00:00:00 → 11:59:59)返回“am”, 下午(12:00:00 → 23:59:59)返回“pm”。
| style="text-align: center;" | {{#time:a}}
|-
|-
| style="text-align: center;" | <code>A</code>
| <code>j</code> || 日数,2位数字 || {{#time:j}}
| 上面的<code>a</code>项的大写版本。
| style="text-align: center;" | {{#time:A}}
|-
|-
| style="text-align: center;" | <code>g</code>
| <code>L</code> || 日期星期数,1位数字,星期日为1,星期六为7 || {{#time:L}}
| 十二小时制的小时数(无前缀零)。
| style="text-align: center;" | {{#time:g}}
|-
|-
| style="text-align: center;" | <code>h</code>
| <code>l</code> || 日期星期数,3位汉字 || {{#time:l}}
| 十二小时制的小时(有前缀零)。
| style="text-align: center;" | {{#time:h}}
|-
|-
| style="text-align: center;" | <code>G</code>
| <code>m</code> || 月份数,2位数字 || {{#time:m}}
| 二十四小时制的小时(无前缀零)。
| style="text-align: center;" | {{#time:G}}
|-
|-
| style="text-align: center;" | <code>H</code>
| <code>N</code> || 星期数,星期一为1,星期日为7 || {{#time:N}}
| 二十四小时制的小时(有前缀零)。
| style="text-align: center;" | {{#time:H}}
|-
|-
! colspan="3"| 分钟和秒钟
| <code>n</code> || 月份数,1位或2位数字 || {{#time:n}}
|-
|-
| style="text-align: center;" | <code>i</code>
| <code>r</code> || 英文长日期格式 || {{#time:r}}
| 一小时内已过去的分钟数(有前缀零)。
| style="text-align: center;" | {{#time:i}}
|-
|-
| <code>s</code> || 秒数 || {{#time:s}}
| style="text-align: center;" | <code>s</code>
| 一分钟内已过去的秒数(有前缀零)。
| style="text-align: center;" | {{#time:s}}
|-
|-
| <code>T</code> || UTC ||{{#time:T}}
| style="text-align: center;" | <code>U</code>
| [[Unix时间|Unix时间]]。 自1970年1月1日00:00:00 GMT的秒数。
| style="text-align: center;" | {{#time:U}}
|-
|-
! id="TimeZone" colspan="3"| 时区
| <code>t</code> || 该月天数 || {{#time:t}}
|-
|-
| style="text-align: center;" | <code>e</code>
| <code>U</code> || [[Help:時間序號|時間序號]],1970-1-1 0:0:1为1,參見[[UNIX時間]] || {{#time:U}}
| 时区标识符。
| style="text-align: center;" | {{#time:e}}
|-
|-
| style="text-align: center;" | <code>I</code>
| <code>W</code> || 日期周数,显示日期为当年第几周 || {{#time:W}}
| 是否使用夏令时。
| style="text-align: center;" | {{#time:I}}
|-
|-
| style="text-align: center;" | <code>O</code>
| <code>w</code> || 星期数,星期日为0,星期六为6 || {{#time:w}}
| 与格林尼治时间(GMT)的差值
| style="text-align: center;" | {{#time:O}}
|-
|-
| style="text-align: center;" | <code>P</code>
| <code>Y</code> || 日期年份,4位数字 || {{#time:Y}}
| 与格林威治时间(GMT)的差异,带冒号
| style="text-align: center;" | {{#time:P}}
|-
|-
| style="text-align: center;" | <code>T</code>
| <code>y</code> || 日期年份,2位数字 || {{#time:y}}
| 时区缩写。
| style="text-align: center;" | {{#time:T}}
|-
|-
| style="text-align: center;" | <code>Z</code>
| <code>z</code> || 显示日期为当年第几日 || {{#time:z}}
| 时区偏移(秒)。
| style="text-align: center;" | {{#time:Z}}
|-
! colspan="3"| 杂项
|-
| style="text-align: center;" | <code>t</code>
| 本月日数。
| style="text-align: center;" | {{#time:t}}
|-
| style="text-align: center;" | <code>c</code>
| ISO 8601格式化日期,与<syntaxhighlight lang="moin" inline>Y-m-d"T"H:i:s+00:00</syntaxhighlight>等效。
| style="font-size: 75%;" | {{#time:c}}
|-
| style="text-align: center;" | <code>r</code>
| [[rfc:5322|RFC 5332]]规范化的日期。与<syntaxhighlight lang="moin" inline>D, j M Y H:i:s +0000</syntaxhighlight>等价,但周名和月名可能不是国际化表述。
| style="font-size: 75%;" | {{#time:r}}
|-
! colspan="3" | 非公历(格里历)历法
|-
! colspan="3" | 伊斯兰教历法
|-
| style="text-align: center;" | <code>xmj</code>
| 月内一日。
| {{#time:xmj}}
|-
| style="text-align: center;" | <code>xmF</code>
| 月的全名。
| {{#time:xmF}}
|-
| style="text-align: center;" | <code>xmn</code>
| 月索引。
| {{#time:xmn}}
|-
| style="text-align: center;" | <code>xmY</code>
| 全年。
| {{#time:xmY}}
|-
! colspan="3" | 伊朗历法(Jalaly)
|-
| style="text-align: center;" | <code>xit</code>
| 月内日数。
| {{#time:xit}}
|-
| style="text-align: center;" | <code>xiz</code>
| 年内一日。
| {{#time:xiz}}
|-
| style="text-align: center;" | <code>xij</code>
| 月内一日。
| {{#time:xij}}
|-
| style="text-align: center;" | <code>xiF</code>
| 月的全名。
| {{#time:xiF}}
|-
| style="text-align: center;" | <code>xin</code>
| 月索引。
| {{#time:xin}}
|-
| style="text-align: center;" | <code>xiY</code>
| 全年。
| {{#time:xiY}}
|-
| style="text-align: center;" | <code>xiy</code>
| 2位数年。
| {{#time:xiy}}
|-
! colspan="3" | 希伯来历法
|-
| style="text-align: center;" | <code>xjj</code>
| 月内一日。
| {{#time:xjj}}
|-
| style="text-align: center;" | <code>xjF</code>
| 月的全名。
| {{#time:xjF}}
|-
| style="text-align: center;" | <code>xjt</code>
| 月内日数。
| {{#time:xjt}}
|-
| style="text-align: center;" | <code>xjx</code>
| 月份名称的所有格形式。
| {{#time:xjx}}
|-
| style="text-align: center;" | <code>xjn</code>
| 月数。
| {{#time:xjn}}
|-
| style="text-align: center;" | <code>xjY</code>
| 全年。
| {{#time:xjY}}
|-
! colspan="3" | 泰历
|-
| style="text-align: center;" | <code>xkY</code>
| 泰太阳历中的年份. <br>{{memo|1941年前后,本条目可能与依泰历的真实计算方式出的年份有变化.}}
| {{#time:xkY}}
|-
! colspan="3" | 民国历/主体历
|-
| style="text-align: center;" | <code>xoY</code>
| 全年。
| {{#time:xoY}}
|-
! colspan="3" | 日本历法
|-
| style="text-align: center;" | <code>xtY</code>
| 全年。
| {{#time:xtY}}
|-
! colspan="3" | 标记
|-
| style="text-align: center;" | <code>xn</code>
| 以ASCII原始数字表示的数字代码。
| 在印地语中,<syntaxhighlight lang="moin" inline>{{#time:H, xnH}}</syntaxhighlight>产生०६, 06。
|-
| style="text-align: center;" | <code>xN</code>
| colspan="2" | 类似于<code>xn</code>,但是作为一个toggled flag,会持续到字符串的末尾或者字符串中<code>xN</code>下一次出现。
|-
| style="text-align: center;" | <code>xr</code>
| 将下一个数字格式化为罗马数字。仅适用于10000以内的数字<br><small>(MediaWiki 1.20之前的版本为3000以内)</small>
| <syntaxhighlight lang="moin" inline>{{#time:xrY}}</syntaxhighlight> → {{#time:xrY}}
|-
| style="text-align: center;" | <code>xh</code>
| 将下一个数字格式化为希伯来数字。
| <syntaxhighlight lang="moin" inline>{{#time:xhY}}</syntaxhighlight> → {{#time:xhY}}
|}
|}


该解析器函数接收一个(公历的)日期或者时间,并根据给定的语法将其格式化。可以指定日期/时间对象,默认则为[[Help:魔术字#Date and time|魔术字]]Help:魔术字#Date and time的当前值——也就是说,页面最后被渲染为HTML时的时间。
系统默认的时间参数为当前UTC+0时间,可以使用{{tlxm|#time|参数|+8 hours}}得到当前北京时间(UTC+8时间)。


:<code><nowiki>{{#time:</nowiki> ''format string'' <nowiki>}}</nowiki></code>
时间参数可以使用绝对时间,如“<code>2008-12-31 23:59:59</code>”,也可以使用相对时间,如“<code>+7 days</code>”或者“<code>-5 hours</code>”得到默认时间7日之后或默认时间5小时之前的时间。也可以二者混合使用,比如{{tlxm|#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}}返回“{{#time:Y-m-d H:i:s|2001-2-3 04:05:06 +1 year +2 months +3 days +4 hours +5 minute +6 seconds}}”。
:<code><nowiki>{{#time:</nowiki> ''format string'' <nowiki>|</nowiki> ''date/time object'' <nowiki>}}</nowiki></code>
:<code><nowiki>{{#time:</nowiki> ''format string'' <nowiki>|</nowiki> ''date/time object'' <nowiki>|</nowiki> ''language code'' <nowiki>}}</nowiki></code>
:<code><nowiki>{{#time:</nowiki> ''format string'' <nowiki>|</nowiki> ''date/time object'' <nowiki>|</nowiki> ''language code'' <nowiki>|</nowiki> ''local'' <nowiki>}}</nowiki></code>


右表列举了支持的格式化代码。任何不被识别的格式化字符串都不会被修改,这同样适用于空白字符(系统不使用空白字符来解释代码)。格式化字符串内有两种方法来转义字符:
使用<code>xr</code>可以在其后显示罗马数字,如{{tlxm|#time|'''xr'''Y年'''xr'''m月'''xr'''d日|2008-12-31}}显示为“{{#time:xrY年xrm月xrd日|2008-12-31}}”。
# 反斜杠后跟随一个格式化字符串会被解释为单个原始的字符
# 用英文双引号括起来的字符视为原始字符,引号将被移除。
此外,<code>xx</code>会被解释为单个原始的x。


由于格式化代码列表会持续发展(支持新日历,或支持以不同方式计算和格式化的新日期字段),您应该转义所有需要传入而保持不变的文字字符(不仅仅是格式化代码当前使用的ASCII字母)。
產生與簽名格式相同的時間語法為:{{tlxm|#time|Y年n月j日 (D) H:i (\U\TC)}},顯示為「{{#time:Y年n月j日 (D) H:i (\U\TC)}}」(亦可將UTC直接放在<code>time</code>外面,如<code>{{tlm|#time|Y年n月j日 (D) H:i}} (UTC)</code>或使用參數<code>T</code>:{{tlxm|#time|Y年n月j日 (D) H:i (T)}})。


不幸的是,目前,ASCII单引号仍未被视为当前已经受支持的ASCII双引号(可标记文字文本)和反斜杠(在许多语言使用的字符串常量中也必须转义,包括JSON、C、C++、PHP、JavaScript、Lua)的简单替代方法(例如,双引号在其他用途​​中是强制性的,例如JSON、C、C++等语言中的字符串值的定界)。
=== <tt>language</tt> ===
因此,您仍然无法在不使用反斜杠转义的情况下嵌入任何文字双引号(或者也可以使用其他弯引号、角形引号或方引号)。
<code>#language</code>得到指定語言代碼的該語言名稱(以当地语言表示)。
* {{tlxm|#language|de}} → {{#language:de}}
* {{tlxm|#language|en}} → {{#language:en}}
* {{tlxm|#language|ja}} → -{ {{#language:ja}}}-
* {{tlxm|#language|nl}} → {{#language:nl}}
* {{tlxm|#language|zh}} → -{ {{#language:zh}}}-
* {{tlxm|#language|zh-cn}} → -{ {{#language:zh-cn}}}-
* {{tlxm|#language|zh-tw}} → -{ {{#language:zh-tw}}}-
* {{tlxm|#language|zh-hk}} → -{ {{#language:zh-hk}}}-
* {{tlxm|#language|zh-sg}} → -{ {{#language:zh-sg}}}-


:<syntaxhighlight lang="moin" inline>{{#time: Y-m-d }}</syntaxhighlight> → '''{{#time: Y-m-d }}'''
加入第二参数时,显示该语言在第二参数语言中的名称。
:<syntaxhighlight lang="moin" inline>{{#time: [[Y]] m d }}</syntaxhighlight> → '''{{#time: [[Y]] m d }}'''
* {{tlxm|#language|de|en}} → -{ {{#language:de|en}} }-
:<syntaxhighlight lang="moin" inline>{{#time: [[Y (year)]] }}</syntaxhighlight> → '''{{#time: [[Y (year)]] }}'''
* {{tlxm|#language|en|ja}} → -{ {{#language:en|ja}} }-
:<syntaxhighlight lang="moin" inline>{{#time: [[Y "(year)"]] }}</syntaxhighlight> → '''{{#time: [[Y "(year)"]] }}'''
* {{tlxm|#language|ja|nl}} → -{ {{#language:ja|nl}} }-
:<syntaxhighlight lang="moin" inline>{{#time: i's" }}</syntaxhighlight> → '''{{#time: i's" }}'''
* {{tlxm|#language|nl|zh}} → -{ {{#language:nl|zh}} }-
* {{tlxm|#language|zh|de}} → -{ {{#language:zh|de}} }-


<code>''date/time object''</code>可以是任何PHP [https://php.net/function.strtotime strtotime()]函数接受的格式。
<!--
绝对(如<code>20 December 2000</code>)、相对(如<code>+20 hours</code>)和混合时间(如<code>30 July +1 year</code>)格式均是可以的。
=== <tt>babel</tt> ===

* {{tlxm|#babel|''babelcode1''|''babelcode2''|...}}
:<syntaxhighlight lang="moin" inline>{{#time: r|now}}</syntaxhighlight> → '''{{#time: r|now}}'''
替换为{{tlx|babel}}模板,见[[mw:Extension:Babel#Usage|Extension:Babel]]。
:<syntaxhighlight lang="moin" inline>{{#time: r|+2 hours}}</syntaxhighlight> → '''{{#time: r|+2 hours}}'''
-->
:<syntaxhighlight lang="moin" inline>{{#time: r|now + 2 hours}}</syntaxhighlight> → '''{{#time: r|now + 2 hours}}'''
:<syntaxhighlight lang="moin" inline>{{#time: r|20 December 2000}}</syntaxhighlight> → '''{{#time: r|20 December 2000}}'''
:<syntaxhighlight lang="moin" inline>{{#time: r|December 20, 2000}}</syntaxhighlight> → '''{{#time: r|December 20, 2000}}'''
:<syntaxhighlight lang="moin" inline>{{#time: r|2000-12-20}}</syntaxhighlight> → '''{{#time: r|2000-12-20}}'''
:<syntaxhighlight lang="moin" inline>{{#time: r|2000 December 20}}</syntaxhighlight> &rarr; '''{{#time: r|2000 December 20}}'''

[[ISO 639-3|ISO 639-3]](?)中的<code>''language code''</code>允许字符串显示为指定语言。

:<syntaxhighlight lang="moin" inline>{{#time:d F Y|1988-02-28|nl}}</syntaxhighlight> → '''{{#time:d F Y|1988-02-28|nl}}'''
:<syntaxhighlight lang="moin" inline>{{#time:l|now|uk}}</syntaxhighlight> → '''{{#time:l|now|uk}}'''
:<syntaxhighlight lang="moin" inline>{{#time:d xg Y|20 June 2010|pl}}</syntaxhighlight> → '''{{#time:d xg Y|20 June 2010|pl}}'''

<code>''local''</code>参数指定''date/time object''是指本地时区还是UTC时间。

这是一个布尔参数,其值是通过转换(casting)参数值来确定的(有关如何将字符串转换为布尔值的详细信息,请参阅[https://php.net/language.types.boolean#language.types.boolean.casting 官方PHP文档])。

{{memo|2=reminder|1=请注意,如果{{phpi|$wgLocaltimezone}}设为<code>UTC</code>,则当<code>local</code>设为<code>true</code>或<code>false</code>时输出无区别。}}

参考下面的详细示例:

:<syntaxhighlight lang="moin" inline>{{#time: Y F d H:i:s|now|it|0}}</syntaxhighlight> → '''{{#time: Y F d H:i:s|now|it|0}}'''
:<syntaxhighlight lang="moin" inline>{{#time: Y F d H:i:s|now|it|1}}</syntaxhighlight> → '''{{#time: Y F d H:i:s|now|it|1}}'''
:<syntaxhighlight lang="moin" inline>{{#time: Y F d H:i:s|+2 hours||0}}</syntaxhighlight> → '''{{#time: Y F d H:i:s|+2 hours||0}}'''
:<syntaxhighlight lang="moin" inline>{{#time: Y F d H:i:s|+2 hours||1}}</syntaxhighlight> → '''{{#time: Y F d H:i:s|+2 hours||1}}'''

:<syntaxhighlight lang="moin" inline>{{#time:c|2019-05-16T17:05:43+02:00|it}}</syntaxhighlight> → '''{{#time:c|2019-05-16T17:05:43+02:00|it}}'''
:<syntaxhighlight lang="moin" inline>{{#time:c|2019-05-16T17:05:43+02:00|it|0}}</syntaxhighlight> → '''{{#time:c|2019-05-16T17:05:43+02:00|it|0}}'''
:<syntaxhighlight lang="moin" inline>{{#time:c|2019-05-16T17:05:43+02:00|it|true}}</syntaxhighlight> → '''{{#time:c|2019-05-16T17:05:43+02:00|it|true}}'''

如果你已经计算了Unix时间戳,你可以通过添加<code>@</code>符号前缀来在日期计算中使用。

:<syntaxhighlight lang="moin" inline>{{#time: U | now }}</syntaxhighlight> → '''{{#time: U | now}}'''
:<code><nowiki>{{#time: r | @</nowiki>{{#time: U}} <nowiki>}}</nowiki></code> → '''{{#time: r | @{{#time:U}} }}'''

{{Warning|1=
若不在數字格式的時間戳值的前面包含<code>@</code>前綴,結果通常會出錯或是未預期的數值:

:<syntaxhighlight lang="moin" inline>{{#time: r | 1970-01-01 00:16:39 }}</syntaxhighlight> → '''{{#time: r | 1970-01-01 00:16:39 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: U | 1970-01-01 00:16:39 }}</syntaxhighlight> → '''{{#time: U | 1970-01-01 00:16:39 }}'''
:<code><nowiki>{{#time: r | @</nowiki>{{#time: U | 1970-01-01 00:16:39 }}<nowiki> }}</nowiki></code> → '''{{#time: r | @{{#time: U | 1970-01-01 00:16:39 }} }}''' (正確)
:<code><nowiki>{{#time: r | </nowiki>{{#time: U | 1970-01-01 00:16:39 }}<nowiki> }}</nowiki></code> → '''{{#time: r | {{#time: U | 1970-01-01 00:16:39 }} }}''' (不支援的年份格式)
:<syntaxhighlight lang="moin" inline>{{#time: r | 1970-01-01 00:16:40 }}</syntaxhighlight> → '''{{#time: r | 1970-01-01 00:16:40 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: U | 1970-01-01 00:16:40 }}</syntaxhighlight> → '''{{#time: U | 1970-01-01 00:16:40 }}'''
:<code><nowiki>{{#time: r | @</nowiki>{{#time: U | 1970-01-01 00:16:40 }}<nowiki> }}</nowiki></code> → '''{{#time: r | @{{#time: U | 1970-01-01 00:16:40 }} }}''' (正確)
:<code><nowiki>{{#time: r | </nowiki>{{#time: U | 1970-01-01 00:16:40 }}<nowiki> }}</nowiki></code> → '''{{#time: r | {{#time: U | 1970-01-01 00:16:40 }} }}''' (被解讀為某年的当前月份和日期)
:<syntaxhighlight lang="moin" inline>{{#time: r | 1970-01-01 02:46:39 }}</syntaxhighlight> → '''{{#time: r | 1970-01-01 02:46:39 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: U | 1970-01-01 02:46:39 }}</syntaxhighlight> → '''{{#time: U | 1970-01-01 02:46:39 }}'''
:<code><nowiki>{{#time: r | @</nowiki>{{#time: U | 1970-01-01 02:46:39 }}<nowiki> }}</nowiki></code> → '''{{#time: r | @{{#time: U | 1970-01-01 02:46:39 }} }}''' (正確)
:<code><nowiki>{{#time: r | </nowiki>{{#time: U | 1970-01-01 02:46:39 }}<nowiki> }}</nowiki></code> → '''{{#time: r | {{#time: U | 1970-01-01 02:46:39 }} }}''' (被解讀為某年的当前月份和日期)
:<syntaxhighlight lang="moin" inline>{{#time: r | 1970-01-01 02:46:40 }}</syntaxhighlight> → '''{{#time: r | 1970-01-01 02:46:40 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: U | 1970-01-01 02:46:40 }}</syntaxhighlight> → '''{{#time: U | 1970-01-01 02:46:40 }}'''
:<code><nowiki>{{#time: r | @</nowiki>{{#time: U | 1970-01-01 02:46:40 }}<nowiki> }}</nowiki></code> → '''{{#time: r | @{{#time: U | 1970-01-01 02:46:40 }} }}''' (正確)
:<code><nowiki>{{#time: r | </nowiki>{{#time: U | 1970-01-01 02:46:40 }}<nowiki> }}</nowiki></code> → '''{{#time: r | {{#time: U | 1970-01-01 02:46:40 }} }}''' (不支援的年分格式)
}}

{{Warning|1=
可接受的范围为0111年1月1日(1 January 0111)到9999年12月31日(31 December 9999)。对于年份100到110,输出不连贯,Y和闰年类似于年份100-110,而r、D、I和U可能会将这些年份解释为2000-2010。

:<syntaxhighlight lang="moin" inline>{{#time: d F Y | 29 Feb 0100 }}</syntaxhighlight> → '''{{#time: d F Y | 29 Feb 0100 }}'''<br> (正確,沒有閏年),但是
:<syntaxhighlight lang="moin" inline>{{#time: r | 29 Feb 0100 }}</syntaxhighlight> → '''{{#time: r | 29 Feb 0100 }}''' (錯誤,即使100也被解讀為2000,因为那是閏年)
:<syntaxhighlight lang="moin" inline>{{#time: d F Y | 15 April 10000 }}</syntaxhighlight> → '''{{#time: d F Y | 15 April 10000 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: r | 10000-4-15 }}</syntaxhighlight> → '''{{#time: r | 10000-4-15 }}'''

年份数字0-99解释为2000-2069和1970-1999,除非添加前缀0以写成四位数格式:

:<syntaxhighlight lang="moin" inline>{{#time: d F Y | 1 Jan 6 }}</syntaxhighlight> → '''{{#time: d F Y | 1 Jan 6 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: d F Y | 1 Jan 06 }}</syntaxhighlight> → '''{{#time: d F Y | 1 Jan 06 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: d F Y | 1 Jan 006 }}</syntaxhighlight> → '''{{#time: d F Y | 1 Jan 006 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: d F Y | 1 Jan 0006 }}</syntaxhighlight> → '''{{#time: d F Y | 1 Jan 0006 }}''' (4-digit format)

年份100-110和1753之后的年份支持工作日,对于年份111-1752,r的输出显示“Unknown”,l输出“<>”,结果,这些年份不支持r输出。
}}

可以指定完整的或部分绝对的日期;函数会使用“当前”值“填充”日期中未被指定的部分。

:<syntaxhighlight lang="moin" inline>{{#time: Y | January 1 }}</syntaxhighlight> → '''{{#time: Y | January 1 }}'''

{{Warning|1=
“填充”功能并不连贯,有些部分会使用当前值填充,其他的则不会:

:<syntaxhighlight lang="moin" inline>{{#time: Y m d H:i:s | June }}</syntaxhighlight> → '''{{#time: Y m d H:i:s | June }}''' <small>给予这一天的开始,而不是当前月份中的日期和当前年份。</small>
:<syntaxhighlight lang="moin" inline>{{#time: Y m d H:i:s | 2003 }}</syntaxhighlight> → '''{{#time: Y m d H:i:s | 2003 }}''' <small>给予这一天的开始,而不是这一年的当前日期。</small>

填充日期有特例:

:<syntaxhighlight lang="moin" inline>{{#time: Y m d H:i:s | June 2003 }}</syntaxhighlight> → '''{{#time: Y m d H:i:s | June 2003 }}''' <small>给予这一天的开始和这个月的开始。</small>
}}

4位數字總是被解讀為年分,而不是小時和分鐘:

:<syntaxhighlight lang="moin" inline>{{#time: Y m d H:i:s | 1959 }}</syntaxhighlight> → '''{{#time: Y m d H:i:s | 1959 }}'''

6位數字儘量被解讀為小時、分鐘、秒,不然會被解讀為錯誤(而不是年份和月份):

:<syntaxhighlight lang="moin" inline>{{#time: Y m d H:i:s | 195909 }}</syntaxhighlight> → '''{{#time: Y m d H:i:s | 195909 }}''' <small>輸入被視為時間而不是年+月代碼。</small>
:<syntaxhighlight lang="moin" inline>{{#time: Y m d H:i:s | 196009 }}</syntaxhighlight> → '''{{#time: Y m d H:i:s | 196009 }}''' <small>雖然19:60:09不是有效時間,但196009不被解讀為1960年9月。</small>

該函數執行一定數量的日期算數:

:<syntaxhighlight lang="moin" inline>{{#time: d F Y | January 0 2008 }}</syntaxhighlight> → '''{{#time: d F Y | January 0 2008 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: d F | January 32 }}</syntaxhighlight> → '''{{#time: d F | January 32 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: d F | February 29 2008 }}</syntaxhighlight> → '''{{#time: d F | February 29 2008 }}'''
:<syntaxhighlight lang="moin" inline>{{#time: d F | February 29 2007 }}</syntaxhighlight> → '''{{#time: d F | February 29 2007 }}'''
:<syntaxhighlight lang="moin" inline>{{#time:Y-F|now -1 months}}</syntaxhighlight> → '''{{#time:Y-F|now -1 months}}'''

<code>#time</code>調用的格式字符串的總長度限制為6000個字符。

<span id="Time_Zone_issue"></span>
==== 时区问题 ====

<nowiki>#</nowiki>time解析器函数有个bug(尤其是PHP DateTime),不允许传入非整数的相对时区偏移。这个问题不适用于使用基于小时的时区,例如EDT。例如:

* <syntaxhighlight lang="moin" inline>{{#time:g:i A | -4 hours }}</syntaxhighlight> &rarr; {{#time:g:i A | -4 hours}}

但是,印度(India)是UTC +5.5个小时的时间偏移,因此使用时区不会正常地计算相对时区偏移。因此:

* <syntaxhighlight lang="moin" inline>{{#time:g:i A | +5.5 hours }}</syntaxhighlight> &rarr; {{#time:g:i A | +5.5 hours }}

要解决这个问题,可将时间简单转换为分钟或者秒,像这样:

* <syntaxhighlight lang="moin" inline>{{#time:g:i A | +330 minutes }}</syntaxhighlight> &rarr; {{#time:g:i A | +330 minutes }}
* <syntaxhighlight lang="moin" inline>{{#time:g:i A | +19800 seconds }}</syntaxhighlight> &rarr; {{#time:g:i A | +19800 seconds }}

(Tim Starling,该函数的开发者,提供了该解决方案的准确语法。)

== #timel ==
该函数等价于<code><nowiki>{{#time: ... }}</nowiki></code>,其中<code>local</code>参数设置为<code>true</code>,因此总是使用wiki的本地时间($wgLocaltimezone中设置的)。

该函数的语法为:

:<code><nowiki>{{#timel:</nowiki> ''format string'' <nowiki>}}</nowiki></code>
:<code><nowiki>{{#timel:</nowiki> ''format string'' <nowiki>|</nowiki> ''date/time object'' <nowiki>}}</nowiki></code>
:<code><nowiki>{{#timel:</nowiki> ''format string'' <nowiki>|</nowiki> ''date/time object'' <nowiki>|</nowiki> ''language code'' <nowiki>}}</nowiki></code>

{{memo|2=reminder|1=请注意,如果变量{{phpi|$wgLocaltimezone}}设为<code>UTC</code>,则当<code>local</code>设为<code>true</code>或<code>false</code>时输出无区别。}}

[[File:Time-Timel.png|thumb|使用#time和#timel解析器函数的示例,其中服务器处于非UTC时区]]

例如,参考以下示例:

:<syntaxhighlight lang="moin" inline>{{#time:c|now|it}}</syntaxhighlight> → '''{{#time:c|now|it}}'''
:<syntaxhighlight lang="moin" inline>{{#time:c|now|it|0}}</syntaxhighlight> → '''{{#time:c|now|it|0}}'''
:<syntaxhighlight lang="moin" inline>{{#time:c|now|it|1}}</syntaxhighlight> → '''{{#time:c|now|it|1}}'''
:<syntaxhighlight lang="moin" inline>{{#timel:c|now|it}}</syntaxhighlight> → '''{{#timel:c|now|it}}'''

[[File:Maldiskusjon Sommertid–Wikipedia.jpg|thumb|https://no.wikipedia.org/wiki/Maldiskusjon:Sommertid的警告範例]]

{{Warning|1=
注意对于time和timel,U会都返回自1970-01-01 00:00:00 UTC(即GMT)的秒数,无论时区是否为UTC。

:<code>U</code> Unix时间。自1970年1月1日 00:00:00(GMT)以来的秒数。
:<code>Z</code> 时区偏移(秒)。
:<syntaxhighlight lang="moin" inline>{{#time: U}}</syntaxhighlight> → '''{{#time: U}}'''
:<syntaxhighlight lang="moin" inline>{{#timel: U}}</syntaxhighlight> → '''{{#timel: U}}'''
:<syntaxhighlight lang="moin" inline>{{#time: Z}}</syntaxhighlight> → '''{{#time: Z}}'''
:<syntaxhighlight lang="moin" inline>{{#timel: Z}}</syntaxhighlight> → '''{{#timel: Z}}'''
}}

{{-}}

{{Anchor|titleparts}}
== #titleparts ==
此函数将页面标题根据斜杠划分成多个分段,然后输出返回这些分段中的部分。
: {{tmpl|0=<code class="mw-highlight">{{((}}#titleparts: ''$1'' {{!}} ''$2'' {{!}} ''$3'' {{))}}</code>
|1=页面名称
|2=需要返回的分段数量
|3=要返回的第一个分段
}}

如果没有指定''要返回的分段数量''参数,则默认为“0”,会从''要返回的第一个分段''(包含)开始返回所有分段。如果''要返回的第一个分段''参数没有指定或者为“0”,则默认为“1”。

: <code><nowiki>{{#titleparts:</nowiki> <span style="color: blue;">{{ns:1}}:Foo/bar/baz/quok</span> <nowiki>}}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok }}'''
: <code><nowiki>{{#titleparts:</nowiki> <span style="color: blue;">{{ns:1}}:Foo</span>/bar/baz/quok <nowiki>| 1 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | 1 }}''' <small>See also <nowiki>{{</nowiki>ROOTPAGENAME<nowiki>}}</nowiki>.</small>
: <code><nowiki>{{#titleparts:</nowiki> <span style="color: blue;">{{ns:1}}:Foo/bar</span>/baz/quok <nowiki>| 2 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | 2 }}'''
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/<span style="color: blue;">bar/baz</span>/quok <nowiki>| 2 | 2 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | 2 | 2 }}'''
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/<span style="color: blue;">bar/baz/quok</span> <nowiki>| | 2 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | | 2 }}'''
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/bar/baz/quok <nowiki>| | 5 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | | 5 }} '''

两个值都接受负值。''要返回的分段数量''参数的负值会从字符串的最后开始“剥离”分段。''要返回的第一个分段''参数的负值解释为“从这一分段开始,从右边开始计数”:

: <code><nowiki>{{#titleparts:</nowiki> <span style="color: blue;">{{ns:1}}:Foo/bar/baz</span>/quok <nowiki>| -1 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | -1 }}''' <small>从字符串的末尾剥离一段 参见{{[[Special:MyLanguage/Help:Magic_words#Page_names|BASEPAGENAME]]}}。</small>
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/bar/baz/quok <nowiki>| -4 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | -4 }} ''' <small>从字符串的末尾剥离所有4段</small>
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/bar/baz/quok <nowiki>| -5 }}</nowiki></code> → '''{{#titleparts: {{ns:1}}:Foo/bar/baz/quok | -5 }} ''' <small>从字符串的末尾剥离5段(多于已存在的)</small>
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/bar/baz/<span style="color: blue;">quok</span> <nowiki>| | -1 }}</nowiki></code> → ''' {{#titleparts: {{ns:1}}:Foo/bar/baz/quok | | -1 }}''' <small>返回最后一段。 参见{{[[Special:MyLanguage/Help:Magic_words#Page_names|SUBPAGENAME]]}}。</small>
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/<span style="color: blue;">bar/baz</span>/quok <nowiki>| -1 | 2 }}</nowiki></code> → ''' {{#titleparts: {{ns:1}}:Foo/bar/baz/quok | -1 | 2 }}''' <small>从字符串的末尾剥离一段,然后返回第二段及以后的段</small>
: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/bar/<span style="color: blue;">baz</span>/quok <nowiki>| -1 | -2 }}</nowiki></code> → ''' {{#titleparts: {{ns:1}}:Foo/bar/baz/quok | -1 | -2 }}''' <small>从倒数第二个元素开始复制;从字符串的末尾剥离一段</small>

处理前,''页面名称''参数是HTML解码的:如果包含一些标准的HTML字符实体,将被转换为纯字符(内部使用UTF-8编码,也就是与使用解析器函数的MediaWiki源页面中的编码相同)。

: 例如,''页面名称''中出现了<code>&amp;quot;</code>、<code>&amp;#34;</code>、<code>&amp;#x22;</code>的地方,都会替换为<code>"</code>。
: 不会执行从HTML到纯文本的其他转换,因此即使HTML标签在页面标题中无效,在此初始步骤中也会保持不变。

{{mbox| text=
MediaWiki的一些魔术字或解析器函数(例如<code><nowiki>{{</nowiki>PAGENAME<nowiki>}}</nowiki></code>和类似)会返回用多余的HTML编码的字符串,即使其自身的输入参数不是HTML编码的:

titleparts解析器函数可以用作一个解决办法,以转换返回的字符串,因此可以被其他的一些解析器函数正确处理,如果这些<!-- 替换原文中的长定语 -->解析器函数参数中也会接收页面名称,比如<code><nowiki>{{</nowiki>PAGESINCAT:<nowiki>}}</nowiki></code>(但对于HTML编码的字符串仍然不能正确处理)。

例如,如果当前页面是[[commons:Category:Côte-d'Or|Category:Côte-d'Or]],那么:

* <code><nowiki>{{#ifeq: {{FULLPAGENAME}} | Category:Côte-d'Or | 1 | 0 }}</nowiki></code>、<code><nowiki>{{#ifeq: {{FULLPAGENAME}} | Category:Côte-d&amp;apos;Or | 1 | 0 }}</nowiki></code>都会返回<code>1</code>;(#ifeq解析器函数不会对输入参数进行HTML解码)。
* <code><nowiki>{{#switch: {{FULLPAGENAME}} | Category:Côte-d'Or = 1 | #default = 0 }}</nowiki></code>、<code><nowiki>{{#switch: {{FULLPAGENAME}} | Category:Côte-d&amp;apos;Or = 1 | #default = 0 }}</nowiki></code>都会返回<code>1</code>;(#switch解析器函数不会对输入参数进行HTML解码)。
* <code><nowiki>{{#ifexist: {{FULLPAGENAME}} | 1 | 0 }}</nowiki></code>、<code><nowiki>{{#ifexist: Category:Côte-d'Or | 1 | 0 }}</nowiki></code>甚至<code><nowiki>{{#ifexist: Category:Côte-d&amp;apos;Or | 1 | 0 }}</nowiki></code>都会返回<code>1</code>,如果这个分类页面存在(#ifexpr解析器函数不会对输入参数进行HTML解码);
* <code><nowiki>{{PAGESINCAT: Côte-d'Or }}</nowiki></code>返回非零数,如果该分类包含页面或子分类,'''但是''':
* <code><nowiki>{{PAGESINCAT: {{CURRENTPAGENAME}} }}</nowiki></code>可能会'''无条件'''地返回0,就像:
* <code><nowiki>{{PAGESINCAT: {{PAGENAME:Category:Côte-d'Or}} }}</nowiki></code>
* <code><nowiki>{{PAGESINCAT: {{PAGENAME:Category:Côte-d&amp;apos;Or}} }}</nowiki></code>

这种非预料行为的原因是,对于当前版本的MediaWiki,有两个警告(caveats):

* <code><nowiki>{{FULLPAGENAME}}</nowiki></code>,或者甚至<code><nowiki>{{FULLPAGENAME:Côte-d'Or}}</nowiki></code>''可能会''返回实际HTML编码的字符串<code>Category:Côte-d&amp;apos;Or</code>而不是预期中的<code>Category:Côte-d'Or</code>;<!-- “and that”不翻译 -->
* <code><nowiki>{{PAGESINCAT: Côte-d&amp;apos;Or }}</nowiki></code>'''无条件地'''返回0(PAGESINCAT魔术字不对输入参数进行任何的HTML解码)。

使用titleparts的简单解决方法(如果上述两个警告在MediaWiki的更高版本中修复了,也会继续生效):

* <code><nowiki>{{PAGESINCAT: {{#titleparts: {{CURRENTPAGENAME}} }} }}</nowiki></code>
* <code><nowiki>{{PAGESINCAT: {{#titleparts: {{PAGENAME:Category:Côte-d'Or}} }} }}</nowiki></code>
* <code><nowiki>{{PAGESINCAT: {{#titleparts: {{PAGENAME:Category:Côte-d&amp;apos;Or}} }} }}</nowiki></code>,总是返回相同分类中的实际页面数量。
}}

解码后的''页面名称''会尽可能标准化为MediaWiki支持的标准页面名称:

# 所有下划线都自动替换为空格:
#: <code><nowiki>{{#titleparts:</nowiki> {{ns:1}}:Foo/bah_boo|1|2}}</code> → '''{{#titleparts: {{ns:1}}:Foo/bah_boo|1|2}}''' <small>不是bah_boo,尽管原来的内容有下划线。</small>
# 字符串最多分割25此;更多的斜杠都会忽略,第25个元素将会包含字符串的剩余内容。 字符串也限制在255个字符内,因为要被视为[[Special:MyLanguage/Manual:Page table#Schema summary|页面标题]]:
#: <code><nowiki>{{#titleparts:</nowiki> a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/<span style="color: blue;">y/z/aa/bb/cc/dd/ee</span> <nowiki>| 1 | 25 }}</nowiki></code> → '''{{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee | 1 | 25 }}'''
#: 如果出于某些原因确实要将此函数推到极限(尽管不太可能),可以通过嵌套函数调用来绕过只能分割25此的限制:
#: <code><nowiki>{{#titleparts: {{#titleparts:</nowiki> a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/<span style="color: blue;">z</span>/aa/bb/cc/dd/ee<nowiki>| 1 | 25 }} | 1 | 2}}</nowiki></code> → '''{{#titleparts: {{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee | 1 | 25 }} | 1 | 2}}'''
# 最后,第一个子字符串根据本地wiki的大小写设置进行大写(如果该子字符串也以本地命名空间名称开头,则该命名空间名称也被标准化)。
#: <code><nowiki>{{#titleparts:</nowiki> <span style="color: blue;">talk:a</span>/b/c <nowiki>}}</nowiki></code> → '''{{#titleparts: talk:a/b/c }}'''

{{Warning|1=
您可以把#titleparts用作一个小的“字符串解析器和转换器”,但要考虑到返回第一个子字符串会大写:

: <code><nowiki>{{#titleparts:</nowiki> <span style="color: blue;">one</span>/two/three/four<nowiki>|1|1 }}</nowiki></code> → '''{{#titleparts: one/two/three/four|1|1 }}'''
: <code><nowiki>{{#titleparts:</nowiki> one/<span style="color: blue;">two</span>/three/four<nowiki>|1|2 }}</nowiki></code> → '''{{#titleparts: one/two/three/four|1|2 }}'''

如果需要小写,使用lc:函数以控制输出:

: <code><nowiki>{{lc: {{#titleparts:</nowiki> <span style="color: blue;">one</span>/two/three/four<nowiki>|1|1 }} }}</nowiki></code> → '''{{lc: {{#titleparts:one/two/three/four|1|1 }}}}'''

你可以在字符串开头添加一个“伪”斜杠以修正第一个子字符串的大小写。对于''要返回的第一个分段'',应使用<code>2</code>而不是<code>1</code>。

: <code><nowiki>{{#titleparts:</nowiki> '''/'''<span style="color: blue;">one</span>/two/three/four<nowiki>|1|</nowiki>'''<u>2</u>'''<nowiki> }}</nowiki></code> → '''{{#titleparts: /one/two/three/four|1|2 }}'''
: <code><nowiki>{{#titleparts:</nowiki> '''/'''<span style="color: blue;">One</span>/two/three/four<nowiki>|1|</nowiki>'''<u>2</u>'''<nowiki> }}</nowiki></code> → '''{{#titleparts: /One/two/three/four|1|2 }}'''
}}

{{Warning|1=
一些字符在页面标题中是非法的,会导致#titleparts不解析字符串。

: <code><nowiki>{{#titleparts: {one/two} | 1 | 1 }}</nowiki></code> → '''{{#titleparts: {one/two} | 1 | 1 }}'''. <small>不产生预期的: '''{one'''</small>
: <code><nowiki>{{#titleparts: [[page]]/123 | 1 | 2 }}</nowiki></code> → '''{{#titleparts: [[page]]/123 | 1 | 2 }}'''. <small>不起作用,因为页面标题中的中括号是非法的,并且此解析器函数不处理嵌入在其输入的''页面名称''参数中的链接,即使使用了MediaWiki语法或任何其他HTML或MediaWiki标签。</small>
: <code><nowiki>{{#titleparts: red/#00FF00/blue | 1 | 3 }}</nowiki></code> → "{{#titleparts: red/#00FF00/blue| 1 | 3 }}". <small>不起作用,因为“#”在页面标题中是非法的。</small>
}}

{{Warning|1=
如果标题中的某个部分只是“<code>.</code>”或“<code>..</code>”,那么#titleparts不会解析字符串:

: <code><nowiki>{{#titleparts: one/./three | 1 | 1 }}</nowiki></code> → '''{{#titleparts: one/./three | 1 | 1 }}'''. <small>返回整个字符串。不产生预期的: '''one'''</small>
}}

{{Warning|1=
如果输入超过255个UTF-8字节,则此函数不会正常降级(degrade gracefully)。如果输入字符串为256字节或更多,则返回整个字符串。
}}


<span id="StringFunctions"></span>

== 字符串函数 ==

所有这些函数(<code>len</code>, <code>pos</code>, <code>rpos</code>, <code>sub</code>, <code>replace</code>, <code>explode</code>)都[[mw:Special:Code/MediaWiki/50997|融合]]在了StringFunctions扩展中,但是只有在管理员在<code>LocalSettings.php</code>中启用了<syntaxhighlight lang=php inline>$wgPFEnableStringFunctions = true;</syntaxhighlight>的情况下才能使用。

所有这些函数都以[[大O符号|O(n)]]的时间复杂度运行,使其能够抵御[[DoS|DoS]]攻击。

{{memo|1=<nowiki/>
# 这些函数的部分参数通过全局设置进行限制,以防止滥用。 参见后面的[[#Limits|限制]]段落。
# 对于区分大小写的函数,在某些情况下,可以使用[[Special:MyLanguage/Help:Magic words|魔术字]]<code><nowiki>{{</nowiki>lc:''string''<nowiki>}}</nowiki></code>来解决。
# 要确定MediaWiki服务器是否启用这些功能,请检查[[Special:Version]]中支持的扩展解析器函数列表。
# 字符串长度限制为{{phpi|$wgPFStringLengthLimit}}变量,默认为'''1000'''。
}}

=== #len ===

{{memo|1=<code>#len</code>解析器函数是在1.2.0版本从nsp=0扩展合并的。}}

<nowiki/>#len函数返回指定字符串的长度。
语法为:

<nowiki>{{</nowiki>#len:string}}

返回值始终是源''string''中的字符数量(扩展模板调用之后、转换为HTML之前的字符数量)。
如果未指定字符串,则返回值为零。

{{memo|1=<nowiki/>
* 此函数可安全处理UTF-8多字节字符。 例如:
** <code>{{#len:Žmržlina}}</code> → <code>8</code>
* 前导和尾随的空格或换行不计算在内,但会考虑中间的空格和换行。 例如:
** <code>{{#len:Icecream }}</code> → <code>8</code>
** <code>{{#len: a&nbsp;&nbsp;&nbsp;b }}</code> → <code>5</code> - 2个字符之间3个空格
* 通过引用给出的字符不会转换,而是根据其源格式进行计数。
** <code>{{#len:&amp;nbsp;}}</code> → <code>6</code> - 命名的字符引用
** <code>{{#len:&amp;#32;}}</code> → <code>5</code> - 数字字符引用,不被忽略,尽管它在此处指定了一个空格。
* 像{{tag|nowiki|open}}和其他标签扩展的长度总是为零,因为这些内容对解析器而言是隐藏的。 例如:
** <code>{{#len:&lt;nowiki>This is a &lt;/nowiki>test}}</code> → <code>4</code>
}}

=== #pos ===

{{memo|1=<code>#pos</code>解析器函数是在1.2.0版本从nsp=0扩展合并的。}}

<nowiki/>#pos函数返回给定搜索词在字符串中的位置。
语法为:

<nowiki>{{</nowiki>#pos:string|搜索词<!-- 这是谷歌对search term这个词的翻译 -->|offset}}

''offset''参数如果指定了,则会表明函数应该开始搜索的起始位置。

如果找到了''搜索词'',则返回的值是字符串''string''中的位置(从0开始数)。

如果没有找到''搜索词'',函数返回空字符串。

{{memo|1=<nowiki/>
* 该函数是大小写敏感的。
* ''搜索词''允许的最大长度限制取决于全局设置[[#$wgStringFunctionsLimitSearch|$wgStringFunctionsLimitSearch]]。
* 此函数可安全处理UTF-8多字节字符。 示例: <code><nowiki>{{#pos:Žmržlina|žlina}}</nowiki></code>返回3。
* 像[[##len|#len]]一样,{{tag|nowiki|open}}和其他标签扩展在计算字符位置时都被视为长度为1。 例如: <code><nowiki>{{#pos:&lt;nowiki>This is a &lt;/nowiki>test|test}}</nowiki></code>返回1。
}}

=== #rpos ===

{{memo|1=<code>#rpos</code>解析器函数是在1.2.0版本从nsp=0扩展合并的。}}

<nowiki />#rpos函数返回给定搜索词在字符串中的最后位置。
语法为:

<nowiki>{{</nowiki>#rpos:string|搜索词}}

如果找到了''搜索词'',则返回的值是字符串''string''中的最后位置(从0开始数)。

如果没有找到''搜索词'',函数返回-1。

{{demo-inline|1=使用该函数搜索最后一个分隔符时,给结果添加+1以检索最后一个分隔符之后的位置。 这在找不到分隔符时也有效,因为“-1 + 1”为零,也就是指定值的开头。}}

{{memo|1=<nowiki/>
* 该函数是大小写敏感的。
* ''搜索词''允许的最大长度限制取决于全局设置[[#$wgStringFunctionsLimitSearch|$wgStringFunctionsLimitSearch]]。
* 此函数可安全处理UTF-8多字节字符。 例如: <code><nowiki>{{#rpos:Žmržlina|lina}}</nowiki></code>返回4。
* 像[[##len|#len]]一样,{{tag|nowiki|open}}和其他标签扩展在计算字符位置时都被视为长度为1。 例如: <code><nowiki>{{#rpos:&lt;nowiki>This is a &lt;/nowiki>test|test}}</nowiki></code>返回1。
}}

=== #sub ===

{{memo|1=<code>#sub</code>解析器函数是在1.2.0版本从nsp=0扩展合并的。}}

<nowiki/>#sub函数返回指定字符串中的子字符串(substring)。
语法为:

<pre>{{#sub:string|start|length}}</pre>

''start''参数,如果为正(或者零),则会指定要返回的第一个字符的索引(从0开始数)。

例如:
<code><nowiki>{{#sub:Icecream|3}}</nowiki></code>返回<code>cream</code>。

<code><nowiki>{{#sub:Icecream|0|3}}</nowiki></code>返回<code>Ice</code>。

如果''start''参数为负,则指定要返回从末尾开始的多少个字符。

例如:
<code><nowiki>{{#sub:Icecream|-3}}</nowiki></code>返回<code>eam</code>。

''length''参数,如果存在且为正数,则会指定返回的字符串的最大长度。

例如:
<code><nowiki>{{#sub:Icecream|3|3}}</nowiki></code>返回<code>cre</code>。

如果''length''参数为负,则指定忽略从末尾开始的多少个字符。

例如:
<code><nowiki>{{#sub:Icecream|3|-3}}</nowiki></code>返回<code>cr</code>。

如果''start''参数为负,则指定要返回从末尾开始的多少个字符。
''length''参数,如果存在且为正数,则会指定返回的字符串从开始点开始的最大长度。

例如:
<code><nowiki>{{#sub:Icecream|-3|2}}</nowiki></code>返回<code>ea</code>。

{{memo|1=<nowiki/>
* 如果''length''参数为零,则完全不会用于截断。
** 例如: <code><nowiki>{{#sub:Icecream|3|0}}</nowiki></code>返回<code>cream</code>。 <code><nowiki>{{#sub:Icecream|0|3}}</nowiki></code>返回<code>Ice</code>。
* 如果''start''表示一个超出了由负的''length''参数从末尾截断的位置,则将返回一个空字符串。
** 例如: <code><nowiki>{{#sub:Icecream|3|-6}}</nowiki></code>返回空字符串
* 此函数可安全处理UTF-8多字节字符。 例如: <code><nowiki>{{#sub:Žmržlina|3}}</nowiki></code>返回<code>žlina</code>。
* 像[[##len|#len]]一样,{{tag|nowiki|open}}和其他标签扩展在计算字符位置时都被视为长度为1。 例如: <code><nowiki>{{#sub:&lt;nowiki>This is a &lt;/nowiki>test|1}}</nowiki></code>返回<code>test</code>。
}}

=== #count ===

{{memo|1=<nowiki/><code>#count</code>解析器函数是在1.2.0版本添加到nsp=0扩展中的。}}

<nowiki/>#count函数返回指定子字符串在提供的文本中出现的次数。

<nowiki>{{</nowiki>#count:string|substring}}

=== #replace ===

{{memo|1=<code>#replace</code>解析器函数是在1.2.0版本从nsp=0扩展合并的。}}

<nowiki/>#replace函数返回指定的字符串,并将所有搜索词出现的地方替换成替换词。

<nowiki>{{</nowiki>#replace:string|search term|replacement term}}

如果''search term''未指定或者为空,则搜索单个空格。

如果''replacement term''未指定或者为空,则所有''search term''都会从''string''中移除。

{{memo|1=<nowiki/>
* 该函数是大小写敏感的。
* ''search term''允许的最大长度限制取决于全局设置[[#$wgStringFunctionsLimitSearch|$wgStringFunctionsLimitSearch]]。
* ''replacement term''允许的最大长度限制取决于全局设置[[#$wgStringFunctionsLimitReplace|$wgStringFunctionsLimitReplace]]。
* 即使''replacement term''是空格,也会使用空字符串。 * 这是MediaWiki解析器的副作用。 如要在''replacement term''中使用空格,将其放在nowiki标签中。
** 例如: <code><nowiki>{{#replace:My_little_home_page|_|&lt;nowiki> &lt;/nowiki>}}</nowiki></code>返回<code>My little home page</code>。
** 如果不起作用,尝试使用带有两个自我闭合标签的<code><nowiki>{{#replace:My_little_home_page|_|&lt;nowiki/> &lt;nowiki/>}}</nowiki></code>。
** 注意在替换词中'''''这是唯一可以使用nowiki的地方'''''',因为其他的nowiki都会被用来绕过[[#$wgStringFunctionsLimitReplace|$wgStringFunctionsLimitReplace]],将任意大量的字符串注入到输出中。 因此,在替换词中所有出现{{tag|nowiki|open}}或其他标签扩展的地方都会替换为空格。
* 此函数可安全处理UTF-8多字节字符。 例如: <code><nowiki>{{#replace:Žmržlina|ž|z}}</nowiki></code>返回<code>Žmrzlina</code>。
* 如果单个文本字符串中的多个项都要替换,可以考虑[[mw:Extension:ReplaceSet|Extension:ReplaceSet]]。 该扩展会添加一个空余替换序列的解析器函数。
}}

;忽略大小写的替换:
当前该语法不提供开关大小写敏感设置的选项。
但你可以使用[[Special:MyLanguage/Help:Magic_words#Formatting|格式化的魔术字]]来解决。
(例如,{{tmpl|0=<code>{{((}}lc:$1{{))}}</code>|''你的字符串''}})
例如,如果想从字符串中删除单词“Category:”而不管其大小写,可以输入:

<nowiki>{{#replace:{{lc:{{{1}}}}}|category:|}}</nowiki>

但缺点就是输出的都会变成小写。
如果想在替换后保留大小写,则必须使用多个嵌套级别(即多次替换调用)来实现相同的目的。

=== #explode ===

{{memo|1=<code>#explode</code>解析器函数是在1.2.0版本从nsp=0扩展合并的。}}

<nowiki/>#explode函数将指定的字符串分成多个片段,返回其中一段。
语法为:

<nowiki>{{</nowiki>#explode:string|delimiter|position|limit}}

''delimiter''参数指定一个用来将''string''划分成段的字符串。
这个''delimiter''字符串不是任何片段的一部分,如果有两个''delimiter''彼此相邻,会在二者之间创建一个空片段。
如果该参数未指定,则使用单个空格。
''limit''参数仅在解析器函数中可用,在独立的字符串函数版本中不可用,允许你限制返回的部分的数量,所有剩余文本都包含在最终部分中。

''position''参数指定了返回哪一个片段。
片段是从0开始数的。
如果参数未指定,则使用第一个片段(数字0的片段)。
如果''position''使用负值,则片段会从最后开始数。
这种情况下,第-1个片段表示最后一段。
例如:

* <code><nowiki>{{#explode:And if you tolerate this| |2}}</nowiki></code> 返回 <code>you</code>
* <code><nowiki>{{#explode:String/Functions/Code|/|-1}}</nowiki></code> 返回 <code>Code</code>
* <code><nowiki>{{#explode:Split%By%Percentage%Signs|%|2}}</nowiki></code> 返回 <code>Percentage</code>
* <code><nowiki>{{#explode:And if you tolerate this thing and expect no more| |2|3}}</nowiki></code> 返回 <code>you tolerate this thing and expect no more</code>

返回的值是第''position''个片段。如果片段数量少于''position''指定的,则返回空字符串。

{{memo|1=<nowiki/>
* 该函数是大小写敏感的。
* ''delimiter''允许的最大长度限制由全局设置[[#$wgStringFunctionsLimitSearch|$wgStringFunctionsLimitSearch]]指定。
* 该函数可以安全处理UTF-8多字节字符,例如<code><nowiki>{{#explode:Žmržlina|ž|1}}</nowiki></code>返回<code>lina</code>。
}}

=== #urldecode ===

<code>#urldecode</code>将“[[URL编码|URL编码]]的转义字符转换回原来的可读字符。语法为:

<nowiki>{{</nowiki>#urldecode:值}}

'''注意:'''
* 该函数是通过直接暴露PHP的[https://php.net/function.urldecode urldecode()]函数来运作的。
* 字符代码参考可参见[http://www.w3schools.com/tags/ref_urlencode.asp ''www.w3schools.com'']。
* 与此相反的<code>urlencode</code>,已经融合在了MediaWiki的1.18版本中,具体示例可参见帮助:魔术字。
* urldecode是在2010年从字符串函数通过commit 1b75afd18d3695bdb6ffbfccd0e4aec064785363合并的。

<span id="Limits"></span>
=== 限制 ===

本模块定义三个全局设置:

* [[#$wgStringFunctionsLimitSearch|$wgStringFunctionsLimitSearch]]
* [[#$wgStringFunctionsLimitReplace|$wgStringFunctionsLimitReplace]]
* [[#$wgStringFunctionsLimitPad|$wgStringFunctionsLimitPad]]

这些用于限制一些函数的部分参数以确保函数在O(n)时间复杂度内运行,因此可避免[[Dos|Dos]]攻击,确保安全。

==== $wgString<wbr>FunctionsLimitSearch ====

[[##pos|#pos]]、[[##rpos|#rpos]]、[[##replace|#replace]]、[[##explode|#explode]]都使用了此设置。所有这些函数在运行时都会在更大的字符串中搜索子字符串,这可以在O(n*m)内运行,因此使软件更容易受到[[DoS|DoS]]攻击。将此值设置为特定的更小的数,可将时间复杂度降低到O(n)。

此设置限制了所搜索字符串的最大允许长度。

默认值为30个多字节字符。

==== $wgStringFunctionsLimitReplace ====

[[##replace|#replace]]使用了此设置。此函数将一个字符串的所有出现的地方替换为另一个字符串,这样将能够快速生成非常大量的数据,因此使软件更容易受到[[DoS|DoS]]攻击。此设置限制了替换字符串的最大允许长度。

默认值为30个多字节字符。

<span id="General_points"></span>

== 一般帮助 ==

<span id="Substitution"></span>
=== 替换引用 ===

在井号前面添加<code>'''subst:'''</code>可以将字符串函数[[Special:MyLanguage/Help:Substitution|替换引用]]:

:<code><nowiki>{{subst:#ifexist:</nowiki> {{FULLPAGENAME}} <nowiki>| [[</nowiki>{{FULLPAGENAME}}<nowiki>]] | </nowiki>{{FULLPAGENAME}}<nowiki> }}</nowiki></code> → 将在文本中插入代码'''<code><nowiki>[[</nowiki>{{FULLPAGENAME}}<nowiki>]]</nowiki></code>''',因为{{FULLPAGENAME}}存在。

{{Warning|1=
如果表单时包含''未''替换引用的可变代码,例如变量或者其他解析器函数,那么被替换引用的解析器函数的结果是未定义的。为使结果恒定,需要运算的表达式中的所有易变代码都必须被替换引用。参见[[Help:替换引用|帮助:替换引用]]。}}

{{tag|ref|open&hellip;{{tag|ref|close}} }}内的替换引用不起作用,如要使用,可以使用<code>{{((}}subst:#tag:ref{{!}}</code>&hellip;<code>{{))}}</code>。

<span id="Redirects"></span>
=== 重定向 ===

特别地,[[#.23time|<nowiki>{{</nowiki><code>#time:</code>&hellip;|<code>now-</code>&hellip;<nowiki>}}</nowiki>]]可以方便地重定向到包含日期的页面,但这不起作用。

<span id="Escaping_pipe_characters_in_tables"></span>
=== 在表格中转义管道符 ===
解析器函数会破坏wikitable语法和管道字符(<code><nowiki>|</nowiki></code>),将所有的原始管道字符视为参数分隔符。
为了避免这个,很多wiki使用模板[[{{ns:10}}:!]],其内容仅为一个管道符(<code><nowiki>|</nowiki></code>),自MediaWiki 1.24开始被<code><nowiki>{{!</nowiki></code> 魔术字}}取代。
这会从MediaWiki解析器中“隐藏”管道符号,确保在展开页面上的所有模板和变量之前不考虑它。
然后将被解释为表格的行或列分隔符。
你也可以使用原始的HTML表格语法,尽管这并不直观而且容易出错。

对于需要显示的管道字符,可以使用HTML实体进行转义,显示为纯粹的、未被解释的字符:<code>&amp;#124;</code>。

{| class="wikitable"
! 说明
! 您输入的
! 您输出的
|-
| 将管道字符转义为表格行/列分隔符
| <pre>
{{!}}
</pre>
| style="text-align:center;" | &#124;
|-
| 将管道字符转义为纯字符
| <pre>
&amp;#124;
</pre>
| style="text-align:center;" | &#124;
|}


<span id="Stripping_whitespace"></span>
=== 除去空白字符 ===

空白字符(whitespace),包括换行符、制表符和空格,在这些解析器函数的所有参数的开头和结尾处,都会被除去。如果不希望这样,可以将字符串放在引号中后进行比较。

:<code><nowiki>{{#ifeq: foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo | equal | not equal }}</nowiki></code> → '''{{#ifeq: foo | foo | equal | not equal }}'''
:<code><nowiki>{{#ifeq: "foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" | "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo" | equal | not equal }}</nowiki></code> → '''{{#ifeq: "foo " | " foo" | equal | not equal }}'''

要避免修整then和else部分,一些人为达到目的,会使用<nowiki>&lt;</nowiki>nowiki<nowiki>&gt;</nowiki> <nowiki>&lt;</nowiki>/nowiki<nowiki>&gt;</nowiki>而非空格。

:<syntaxhighlight lang="moin" inline>foo{{#if:|| bar }}foo</syntaxhighlight> → '''foo{{#if:|| bar }}foo'''
:<syntaxhighlight lang="xml" inline>foo{{#if:||<nowiki /> bar <nowiki />}}foo</syntaxhighlight> → '''foo{{#if:||<nowiki /> bar <nowiki />}}foo'''

然而,这种方法只能用于渲染'''单个'''空白字符,因为解析器函数会将一行中的多个空白字符挤压成一个。

:{|
|<syntaxhighlight lang="html"><span style="white-space: pre;">foo{{#if:||<nowiki/> bar <nowiki/>}}foo</span></syntaxhighlight>|| → ||'''<span style="white-space: pre;">foo{{#if:||<nowiki/> bar <nowiki/>}}foo</span>'''
|}

在本例中,<code>white-space: pre</code>样式用来强制浏览器保留空白,但即使使用它,也不会显示空格。发生这种情况是因为这些空格在发送到浏览器之前,就已经被软件除去了。

要解决此问题,可以将空白字符替换为<code>&amp;#32;</code>(''可折行空格'')或者<code>&amp;nbsp;</code>(''不可折行空格''),因为这些字符不会被软件修改:


:<syntaxhighlight lang="html" inline><span style="white-space: pre;">foo{{#if:||&#32;&#32;&#32;bar&#32;&#32;&#32;}}foo</span></syntaxhighlight> → '''<span style="white-space: pre;">foo{{#if:||&#32;&#32;&#32;bar&#32;&#32;&#32;}}foo</span>'''
=== <tt>invoke</tt> ===
:<syntaxhighlight lang="html" inline>foo{{#if:||&nbsp;&nbsp;&nbsp;bar&nbsp;&nbsp;&nbsp;}}foo</syntaxhighlight> → '''foo{{#if:||&nbsp;&nbsp;&nbsp;bar&nbsp;&nbsp;&nbsp;}}foo'''
* <code><nowiki>{{#invoke:|''module''|''function''|''arg1''|''arg2''|...}}</nowiki></code>
调用位于[[mw:Extension:Scribunto|Scribunto]]中的模块,见[[Qiuwen:Lua]]。


请注意,不是所有的参数都是一样的。在解析器函数中,开头和结尾的空白总是被剥离。在模板中,命名的参数和命名的非命名参数的开头和结尾的空白会被剥离,但非命名的参数则不会。
== <tt>subst</tt> ==
{{main|Help:替换引用}}
应用subst:到解析器函数,必须在subst:和#之间不能有空格,才可以正常工作。


:<code>foo{{tlx|1x|content{{=}} bar }}foo</code> → '''foo{{1x|content= bar }}foo'''
== 表格 ==
:<code>foo{{tlx|1x|1{{=}} bar }}foo</code> → '''foo{{1x|1= bar }}foo'''
解析器函数中由于使用了<code>|</code>管道符做参数分隔符,所以不能包括表格所需要的<code>|</code>符。要想在输出前来中包含表格,可以通过以下两个办法达到:
:<code>foo{{tlx|1x|&nbsp;bar&nbsp;}}foo</code> → '''foo{{1x| bar }}foo'''
# 通过嵌套模板来达到隐藏<code>|</code>的目的。比如:{{tlx|!}}
# 使用HTML语法。


<span id="See_also"></span>
== 参见 ==
== 參見 ==
* [[Help:魔术字]]
* [[Help:计算]]
* [[Help:计算]]
* [[Help:模板]]
* [[Help:模板]]
* [[Module:String]]
* [https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions/zh MediaWiki上更为详细的解析器函數幫助]


{{帮助页面}}
{{帮助页面}}