解析器函数

来自istudylinux

#expr

这个函数计算数学表达式并返回计算值或者布尔结果。[1]

  • 1(true)
  • 0(false)
#expr测试用例
{{#expr: 表达式}}
完整的数学计算请参考MediaWiki计算
示例 输出结果 备注
{{#expr: 1 and -1}},{{#expr: 1 and 0}},{{#expr: 2 and 3}} 1,0,1 逻辑与,非0以外的数都是true(1),false(0)
{{#expr: 1 or -1}},{{#expr: 1 or 0}},{{#expr: 2 or 3}} 1,1,1 逻辑或,非0以外的数都是true(1),false(0)
{{#expr: 1>2}},{{#expr: 1<=2}} 0,1 逻辑判断大小,非0以外的数都是true(1),false(0)
{{#expr: (1+1*8/2) mod 3}} 2 混合运算
{{#expr: pi}},{{#expr: 1e3}} 3.1415926535898,1000 π,科学计数
{{#expr: sin30}},{{#expr: sin(30*pi/180)}} -0.98803162409286,0.5 正弦
{{#expr: 1/3 round 5}},{{#expr: 1/6 round 5}} 0.33333,0.16667 round取整,最后的小数大于5会区6,否则使用原数
{{#expr: 1234.5678 round -2}},{{#expr: 1234.5678 round 2}} 1200,1234.57 -2往小数点左边取2位,正数往小数点右边取2位
{{#expr: {{NUMBEROFUSERS}}}},{{#expr: {{NUMBEROFUSERS}}+5}} 11,16 配合魔术字
{{#expr: 45,000 + 100}}
{{#expr: 2 =}}
表达式错误:无法识别的符号“,”。
表达式错误:缺少=的操作数。
错误使用会出现提示信息

#ifexpr

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

#ifexpr测试用例
{{#ifexpr: expression | value if true | value if false }}
示例 输出结果 备注
{{#ifexpr: {{#expr: 2 > 1}} | yes | no }}
{{#ifexpr:  2 > 1 | yes | no }}
yes
yes
{{#ifexpr: {{#expr: 2+1*8 }} | yes | no }}
{{#ifexpr:  2+1*8 | yes | no }}
yes
yes
{{#ifexpr:  | yes | no }}
{{#ifexpr: 0 | yes | no }}
{{#ifexpr: 1 | yes | no }}
no
no
yes

#if

这个函数判断一个字符串是否为空。只包含空格的字符串被视为空字符串。[1]

#if测试用例
{{#if: 测试字符串 | 试字符串非空时的取值 | 测试字符串为空或仅包含空白字符时的取值 }}
{{#if: 参数1 | 参数2 | 参数3 }}
示例 输出结果 备注
{{#if:| yes |no}} no 空值
{{#if: |yes |no}} no 参数输入的是空格
{{#if:


|yes|no}}
no 参数输入的是空格,回车等
{{#if:isl| yes |no}} yes
{{#if: 1==2 | yes | no }} yes
{{#if: 0 |yes | no }} yes 参数1都是当字符串处理
{{#if: isl | yes }} yes 最后一个参数可以忽略
{{#if: | | no }} no
{{#if:{{#if:isl|yes|no}}|里面返回字符串|里面返回空}} 里面返回字符串 嵌套使用
{{#if:{{#if:isl| |no}}|里面返回字符串|里面返回空}} 里面返回空 嵌套使用

#ifeq

这个函数判断两个输入字符串是否相同,并根据结果输出两个字符串的其中一个。 如果需要更多的比较和输出字符串,请考虑使用#switch[1]

#ifeq测试用例
{{#ifeq: 字符串1 | 字符串2 | 两个字符串相等 | 不相等 }}
示例 输出结果 备注
{{#ifeq: 01 | 1 | 相等 | 不相等 }} 相等 如果两个参数都是数字,进行数字比较
{{#ifeq: 0 | -0 | 相等 | 不相等 }} 相等 如果两个参数都是数字,进行数字比较
{{#ifeq: 1e3 | 1000 | 相等 | 不相等 }} 相等
{{#ifeq: {{#expr:10^3}}| 1000 | 相等 | 不相等 }} 相等
{{#ifeq: "01" | "1" | 相等 | 不相等 }} 不相等
{{#ifeq: 真的 | 假的 | 相等 | 不相等 }} 不相等
{{#ifeq: Abc | abc |相等| 不相等 }} 不相等
{{#ifeq: 10^3 | 1000 | 相等 | 不相等 }} 不相等
{{#ifeq: <nowiki>foo</nowiki> | <nowiki>foo</nowiki> | 相等 | 不相等}} 不相等 每个标签在解析的时候回自动添加相关的独立标记
其他的比较如解析器函数,模板

#iferror

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

#iferror测试用例
{{#iferror: test string | value if error | value if correct }}
示例 输出结果 备注
{{#iferror: {{#expr: 1 + 2 }} | 用法错误 | 用法正确 }}
{{#iferror: {{#expr: 1 + 2 }} | 用法错误  }}
用法正确
3
{{#iferror: {{#expr: 2 =}} | 用法错误 | 用法正确 }} 用法错误
{{#iferror: <strong class="error">a</strong> | 标签带error | 标签不带error }} 标签带error
{{#iferror: {{#expr: 2 =}} | 解析结果带error | 解析结果带不带error }} 解析结果带error

#rel2abs

这个函数将文件的相对路径转换为绝对路径。[1]

  • .本级目录
  • ../上级目录
  • /标题下级目录
#rel2abs测试用例
{{#rel2abs: path }}
{{#rel2abs: path | base path }}
示例 输出结果 备注
{{#rel2abs: {{PAGENAME}} |模板:a/b/c }}
{{#rel2abs: {{PAGENAME}}}}
解析器函数
解析器函数
{{#rel2abs: ./{{PAGENAME}} |模板:a/b/c }}
{{#rel2abs:  /{{PAGENAME}} |模板:a/b/c }}
模板:a/b/c/解析器函数
模板:a/b/c/解析器函数
./和/是一样的
{{#rel2abs: ../{{PAGENAME}} |模板:a/b/c }}
{{#rel2abs: ../../{{PAGENAME}} |模板:a/b/c }}
{{#rel2abs: ../../../{{PAGENAME}} |模板:a/b/c }}
模板:a/b/解析器函数
模板:a/解析器函数
解析器函数
{{#rel2abs: ../../ |模板:a/b/c }}
{{#rel2abs: .././ |模板:a/b/c }}
{{#rel2abs: .././../ |模板:a/b/c }}
模板:a
模板:a/b
模板:a
{{#rel2abs: ../../ |模板:a/b/c }}
{{#rel2abs: ../../../ |模板:a/b/c }}
{{#rel2abs: ../../../../ |模板:a/b/c }}
模板:a

错误:无效路径深度:“模板:a/b/c/../../../..”(尝试访问根节点以上节点)

#ifexist

这个函数将一组字符串作为输入,并翻译成页面标题,然后根据在本地wiki上是否存在该页面而返回对应的值。[1]尽量少用。

被视为“高开销(expensive)解析器函数”,每个页面调用这类函数的次数(包括包含于嵌入式模板的函数)存在一个限制。

#ifexist测试用例
{{#ifexist: 页面名称 | 页面存在结果 | 页面不存在结果 }}
示例 输出结果 备注
{{#ifexist: 模板:我的模板 | 页面存在 | 页面不存在 }} 页面不存在
{{#ifexist: File:MediaWiki.png | 文件存在 | 文件不存在 }} 文件存在
{{#ifexist: Mediawiki:common.css | 页面存在 | 页面存在 }} 文件存在 只要是标题都可以

#switch

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

语法:

{{#switch: comparison string
 | case = result
 | case = result
 | ...
 | case = result
 | default result
}}

默认值

#switch默认值
示例 输出结果 备注
{{#switch: 1 | 1 = 为1 | 2 = 为2 | 其他值 }}
{{#switch: 3 | 1 = 为1 | 2 = 为2 | 其他值 }}
为1
其他值
默认值通常写在最后
{{#switch: 1 
| 1 = 为1 
| #default = 其他值 
| 2 = 为2 }}
其他值 使用#default可以出现在任意位置
{{#switch: 1 
| 1 = 为1 
| 2 = 为2 }}
不写默认值不返回结果

分组

#switch分组
示例 输出结果 备注
{{#switch: 2 
| 1  
| 2  
| 3 = 小于等于3
| 4  
| 5  
| 6 = 大于3,小于7
| 不在区间范围,请输入1-6
}}
小于等于3 1,2,3为一组,4,5,6为一组

比较

若被比较字符串和测试用例字符串都是数字,那么按照数值进行比较;反之若存在一个非纯数字符串,都会按照字符串比较规则进行。[1]

#switch比较
示例 输出结果 备注
{{#switch:  |  = Nothing | 3 = 结果为3 | 其他值 }}
Nothing 可以为空
{{#switch: 1+2 | 2 = 结果为2 | 3 = 结果为3 | 其他值 }}
其他值 作为字符串“1+2”
{{#switch: {{#expr:1+2}} | 2 = 结果为2 | 3 = 结果为3 | 其他值 }}
结果为3 计算后再比较

等号

#switch等号
示例 输出结果 备注
{{#switch: 1=2
 | 1=2 = raw
 | 1{{=}}2 = template
 | default
}}
template 使用模板将“=”号包含
{{#switch: 1=2
 | 1&#61;2 = html
 | default
}}
html 使用HTML标识码&#61;


使用参数

一般是用在模板里。

{{#switch: {{{1}}} 
| 1 = 为1 
| 2 = 为2 
| 其他值 
}}

和#ifeq的转换

  • {{#switch:{{{1}}} |condition1=branch1 |condition2=branch2 |condition3=branch3 |branch4}}

等效于

  • {{#ifeq:{{{1}}}|condition1 |branch1 |{{#ifeq:{{{1}}}|condition2 |branch2 |{{#ifeq:{{{1}}}|condition3 |branch3 |branch4}}}}}}

比如:

{{#switch:abc
|Abc = 输入为Abc
|abc = 输入为abc
|输入未知
}}
等价于:
{{#ifeq: abc | Abc | 输入为Abc | {{#ifeq: abc | abc | 输入为abc | 输入未知 }} }}

#time

该解析器函数接收一个(公历的)日期或者时间,并根据给定的语法将其格式化。可以指定日期/时间对象,页面最后被渲染为HTML时的时间。[1]更加详细的参考官网#time

  • {{#time: format string }}
  • {{#time: format string | date/time object }}
  • {{#time: format string | date/time object | language code }}
  • {{#time: format string | date/time object | language code | local }}
#time
示例 输出结果 备注
{{#time: Y-m-d }} 2024-07-12
  • Y:年,返回4位数的年份
  • y:年,返回2位数的年份
  • n:月,9,12
  • m:月,09,12,0填充
  • j:日,9,12
  • d:日,09,12,0填充
  • z:年内的第几天,1月1日是第0天
  • g:12小时制,7点
  • h:12小时制,07点,0填充
  • G:24小时制,7点
  • H:24小时制,07点,0填充
  • i:
  • s:
  • D:星期几,五
  • N:星期几,5
  • W:周数,28
{{#time: y年m月d日 H:i:s }} 24年07月12日 23:37:23
{{#time: y年m月d日 H:i:s |+8 hours}} 24年07月13日 07:37:23
{{#time: Y年的第W周,第z天}} 2024年的第28周,第193天

#timel

该函数等价于...,其中local参数设置为true,因此总是使用wiki的本地时间。[1]更加详细的参考官网#time

  • {{#timel: format string }}
  • {{#timel: format string | date/time object }}
  • {{#timel: format string | date/time object | language code }}
#timel
示例 输出结果 备注
{{#timel: Y-m-d }} 2024-07-13 其他语法同#time
{{#timel: y年m月d日 h:i:s }} 24年07月13日 07:37:23
{{#timel: y年m月d日 H:i:s}} 24年07月13日 07:37:23
{{#timel: Y年的第W周,第z天}} 2024年的第28周,第194天

#titleparts

此函数将页面标题根据斜杠划分成多个分段,然后输出返回这些分段中的部分。[1]

#titleparts
{{#titleparts: 页面名称 | 需要返回的分段数量 | 要返回的第一个分段 }}
需要返回的分段数量默认为0
要返回的第一个分段未指定或者是0则默认为1
示例 输出结果 备注
{{#titleparts: a/b/c/d/e }} A/b/c/d/e 返回的首字母有大写
{{#titleparts: a/b/c/d/e|0|2 }} b/c/d/e 返回的首字母没有大写
{{#titleparts: a/b/c/d/e | 2 | 2 }} b/c
{{#titleparts: a/b/c/d/e | | 2 }} b/c/d/e
{{#titleparts: a/b/c/d/e | -1 }} A/b/c/d 从字符串的末尾剥离1段
{{#titleparts: a/b/c/d/e | -2 }} A 从字符串的末尾剥离4段
{{#titleparts: a/b/c/d/e | -1 | 2 }} b/c/d 从字符串的末尾剥离一段,然后返回第二段及以后的段
{{#titleparts:a/b/c/d/e | -1 | -2 }} -1 | -2 }} 从倒数第二个元素开始复制;从字符串的末尾剥离一段

字符串函数

#len

#len函数返回指定字符串的长度。[1]

#len
{{#len:string}}
示例 输出结果 备注
{{#len:abcedefg}} 8
{{#len:中文}} 2 一个文字算作1
{{#len: a b }} 5 ab之间有3个空格,前后的空格不计算
{{#len:<nowiki>This is a </nowiki>test}} 4 nowiki标签之间的都为0
{{#len:&nbsp;}} 6 HTML字符这种直接计算,例子中为空格

#pos

#pos函数返回给定搜索词在字符串中的位置。 [1]

#len
{{#pos:string|搜索词|offset}}
示例 输出结果 备注
{{#pos:I am good.|good}} 5 从0开始数,I是0
{{#pos:I am good.|good|6}} 没找到就返回空
{{#pos:I am good.|o}} 6 只返回一个
{{#pos:I am good.| o | 7}} 7 跳过第一个o

#rpos

#rpos函数返回给定搜索词在字符串中的最后的位置。 [1]

#len
{{#rpos:string|搜索词}}
示例 输出结果 备注
{{#rpos:I am good.| o }} 7 仅返回后面的一个o
{{#rpos:I am good.| z }} -1 没找到返回-1

#sub

#sub函数返回指定字符串中的子字符串(substring)。 [1]

正向数 0 1 2 3 4 5 6 7 8 9
负向数 10 9 8 7 6 5 4 3 2 1
字符串 I a m g o o d .
#len
{{#sub:string|start|length}}
  • start:为正数以0开头,负数以1开头
  • length:正数正向数length个,负数反向切掉(-length)个
示例 输出结果 备注
{{#sub:I am good.|2|2}} am “am good.”,取2个字符
{{#sub:I am good.|4|-2}} goo “ good.”,-2就是忽略掉“d.”,这里注意空格被删掉了
{{#sub:I am good.|5|-2}} goo “good.”,-2就是忽略掉“d.”,跟上面一样
{{#sub:I am good.|-3|2 }} od “od.”,2正向取od
{{#sub:I am good.|-3|-1 }} od “od.”,-1忽略掉“.”,取od,结果同上
{{#sub:I am good.|5|-6 }} 超过返回空
{{#sub:<nowiki>This is a <nowiki>test|1}}</code> est 存疑

#count

#count 函数返回指定子字符串在提供的文本中出现的次数。 [1]

#len
{{#count:string|substring}}
示例 输出结果 备注
{{#count:I am good.|am}} 1
{{#count:I am good.|ama}} 0

#replace

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

#len
{{#replace:string|search term|replacement term}}
  • 如果search term未指定或者为空,则搜索单个空格。
  • 如果replacement term未指定或者为空,则所有search term都会从string中移除。
示例 输出结果 备注
{{#replace:I am good.|am | was}} I was good.
{{#replace:I am good.|o|O }} I am gOOd.
{{#replace:I am good.||X }} IXamXgood. 未指定要搜索的子串
{{#replace:I am good.|am| }} I good. 未指定要替换的内容

#explode

#explode函数将指定的字符串分成多个片段,返回其中一段。 [1]

#len
{{#explode:string|delimiter|position|limit}}
  • position:从0开始
  • limit一般不用
示例 输出结果 备注
{{#explode:I am good.| am | 1}} good. 可以是多个字符
{{#explode:I am good.| am | 3}} 超过了返回空
{{#explode:a/b/c/d |/|2 }} c 可以是单个字符
{{#explode:a/b/c/d |/|-1 }} d 负数倒着取,从1开始
{{#explode:1oo234 |o|1 }} 两个相邻的delimiter,则中间取空格0(1),1( ),2(234)
{{#explode:1oo234 |o|2}} 234 两个相邻的delimiter,则中间取空格0(1),1( ),2(234)

#urldecode

#urldecode函数将“URL编码”的转义字符转换回原来的可读字符。 [1]

#len
{{#urldecode:URL值}}
  • position:从0开始
  • limit一般不用
示例 输出结果 备注
{{#urldecode:https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81}} https://zh.wikipedia.org/wiki/百分号编码 转义

参考