使用說明:解析器函式

本页使用了标题或全文手工转换,现处于台湾繁体模式
說明頁面

解析器函式是一個MediaWiki擴充,由mw:Extension:ParserFunctions提供。

ParserFunctions擴充提供11個額外的解析器函式以補充MediaWiki原生的「魔術字」。(有可能會組態到額外的解析器函式以支持執行;這些字串函式已在其他文件頁面記載。)

此擴充提供的所有解析器函式均採用以下形式:

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

各函式名都對大小寫不敏感。語句中的空格、換行等空白字元將被省略。

#expr

類型 運算符號
分組(括弧) ( )
數字 1234.5   e (2.718)   pi (3.142)
二進位運算子 e   一元 +,-
一元 not ceil trunc floor abs exp ln sin cos tan acos asin atan
二進位 ^
* / div mod
+ -
取整 round
邏輯 = != <> > < >= <=
and
or

這個函式計算數學表達式並返回計算值。 在nsp=0中可以透過mw.ext.ParserFunctions.expr來使用此函式。

{{#expr: 表达式 }}

右表依優先級列出了支持的運算子。運算結果的精度和格式受執行wiki伺服器作業系統和站點語言的數字格式影響可能存在差異。

使用布林代數時,0表示false,其他任何非0數值(無論正負)均表示true

{{#expr: 1 and -1 }}1
{{#expr: 1 and 0 }}0
{{#expr: 1 or -1 }}1
{{#expr: -1 or 0 }}1
{{#expr: 0 or 0 }}0

空表達式返回空值,無效的表達式返回錯誤資訊,使用#iferror函式檢查錯誤:

{{#expr: }}
{{#expr: 1+ }}表達式錯誤:缺少+的運算元。
{{#expr: 1 = }}表達式錯誤:缺少=的運算元。
{{#expr: 1 foo 2 }}表達式錯誤:無法辨識詞語「foo」。

置於數字前或數字後的加減號是有意義的,會被視為正負號而不會報錯:

{{#expr: +1 }}1
{{#expr: -1 }}-1
{{#expr: + 1 }}1
{{#expr: - 1 }}-1

注意:使用魔術字輸出數值時,首先要將其格式化以去除逗號,獲得純數字。例如:{{NUMBEROFUSERS}}輸出1,581,而期望的輸出值是1581,使用{{formatnum:{{NUMBEROFUSERS}}|R}}便可以實現。對於某些語言,格式化數字尤為重要。例如孟加拉語中,{{NUMBEROFUSERS}}的輸出結果是৩০,০৬১。

{{#expr:{{NUMBEROFUSERS}}+100}} 表達式錯誤:無法辨識標點符號「,」。
{{#expr:{{formatnum:{{NUMBEROFUSERS}}|R}}+100}}1681

如果你想要进行基于日期时间的计算(如检测当前日期时间是否超过指定日期时间),首先用{{#time: xNU }}将日期时间转换为距1970年1月1日的秒数,再对秒数进行加减运算。 → 如果你想要進行基於日期時間的計算(如檢測當前日期時間是否超過指定日期時間),首先用1713869340將日期時間轉換為距1970年1月1日的秒數,再對秒數進行加減運算。

四捨五入

將左邊的數字四捨五入為1/10的冪的倍數,指數等於右邊給出的數字的截斷值(truncated value)。

向上、向下取整分別使用ceilfloor

案例 結果 捨入方式
{{#expr: 1/3 round 5 }} 0.33333 最終的數字小於5,所以沒有明顯的取整發生 (0.333333… → 0.33333)
{{#expr: 1/6 round 5 }} 0.16667 最終的數字大於5,所以被向上取整 (0.166666… → 0.16667)
{{#expr: 8.99999/9 round 5 }} 1 同理,最後一位數因後一位而加1,進而引起了前面的進位 (0.999998… → 1.00000 → 1)
{{#expr: 1234.5678 round -2 }} 1200 捨入至最近的整百數,負值在小數點左邊。
{{#expr: 1234.5678 round 2 }} 1234.57 捨入至最近的整1/100數,因為正值會捨入至小數點右邊。
{{#expr: 1234.5678 round 2.3 }} 1234.57 捨入指數的小數點在捨入結果中不起作用
{{#expr: trunc 1234.5678 }} 1234 小數部分被全部捨棄(截斷)
四捨五入至最近的整數
{{#expr: 1/3 round 0 }} 0 向下取整至0
{{#expr: 1/2 round 0 }} 1 向上取整至1
{{#expr: 3/4 round 0 }} 1 向上取整至1
{{#expr: -1/3 round 0 }} -0 向上取整至0
{{#expr: -1/2 round 0 }} -1 向下取整至-1
{{#expr: -3/4 round 0 }} -1 向下取整至-1
使用ceil和floor向上或向下取整
{{#expr: ceil(1/3) }} 1 向上取整至1
{{#expr: floor(1/3) }} 0 向下取整至0
{{#expr: ceil(-1/3) }} -0 向上取整至0
{{#expr: floor(-1/3) }} -1 向下取整至-1
{{#expr: ceil 1/3 }} 0.33333333333333 沒有取整,因為1本來就是整數

字串

表達式函式只用於僅含有數字和運算符號的表達式,而字母字串和其它符號不在此列。若需要比較字串,可以用#ifeq替代。

{{#expr: "a" = "a" }}表達式錯誤:無法辨識標點符號「"」。
{{#expr: a = a }}表達式錯誤:無法辨識詞語「a」。
{{#ifeq: a | a | 1 | 0 }}1

#if

這個函式判斷一個字串是否為空。只包含空格的字串被視為空字串。

{{#if: 测试字符串 | 测试字符串非空时的取值 | 测试字符串为空或仅包含空白字符时的取值 }}
{{#if: 参数1 | 参数2 | 参数3 }}

這個函式首先判斷參數1是否為空。如果參數1不為空,則輸出參數2。如果參數1為空或只包含空白內容(空格、換行等),則輸出參數3。

{{#if: | yes | no}}no
{{#if: string | yes | no}}yes
{{#if:      | yes | no}}no
{{#if:


| yes | no}}
no

字串內容會被處理為純文字,因此不會計算數學表達式(參見#ifexpr):

{{#if: 1==2 | yes | no }}yes
{{#if: 0 | yes | no }}yes

最後一個參數(false)可以忽略:

{{#if: foo | yes }} yes
{{#if: | yes }}
{{#if: foo | | no}}

該函式可巢狀。為了做到這一點,巢狀內層的#if函式需要按規則完整填寫所有參數以符合#if的參數形式。一般至多可巢狀7層,該數也可能為wiki自身限制和記憶體限制而有變動。

{{#if: 测试字符串 | 字符串非空时的值 | {{#if: 测试字符串 | 字符串非空时的值 | 字符串为空(或只有空格)的值 }} }}

你可以在#if條件句中以字串變數代替測試字串。在這裡,你需要在變數名的後面加上|(分隔符)以正確引用字串。 (因此如果參數沒有值,則計算結果為一個空字串而非"{{{1}}}"。)

{{#if:{{{1|}}}|你在變數1裡面輸入了文字|變數1裡面沒有文字}}

參見mw:Help:Parser functions in templates以了解更多關於解析器函式中變數的相關例子。

#ifeq

這個函式判斷兩個輸入字串是否相同,並根據結果輸出兩個字串的其中一個。 如果需要更多的比較和輸出字串,請考慮使用#switch

{{#ifeq: string 1 | string 2 | value if identical | value if different }}

如果兩個字串均為數字,則函式會進行數值的比較:

{{#ifeq: 01 | 1 | equal | not equal}}equal
{{#ifeq: 0 | -0 | equal | not equal}}equal
{{#ifeq: 1e3 | 1000 | equal | not equal}}equal
{{#ifeq: {{#expr:10^3}} | 1000 | equal | not equal}}equal

否則,函式會進行文字的比較(大小寫敏感):

{{#ifeq: foo | bar | equal | not equal}}not equal
{{#ifeq: foo | Foo | equal | not equal}}not equal
{{#ifeq: "01" | "1" | equal | not equal}}not equal  (對比上面沒有引號的例子)
{{#ifeq: 10^3 | 1000 | equal | not equal}}not equal  (對比上面帶有#expr的例子,會先回傳一個有效的整數)

作為例子,考慮一個已存在的模板Template:Timer,該模板利用解析器來選擇兩個標準時間,short和long。 它以參數作為第一個輸入來比較字串「short」–這沒有約定順序,但是如果參數在第一個則更容易理解。 模板代碼定義為:

{{#ifeq: {{{1|}}} | short | 20 | 40 }}

會產生如下結果:

{{timer|short}}20
{{timer|20}}40
{{timer}}40

#iferror

這個函式接收一個輸入字串,返回兩個結果中的一個。如果輸入字串包含一個由其他解析器函式(比如#expr#time#rel2abs)、模板錯誤(比如模板迴圈和模板遞迴)或其他解析器「軟錯誤」生成的class="error"的HTML對象,那麼視為真。

{{#iferror: test string | value if error | value if correct }}

待返回字串參數可以省略。若省略"correct"(正確)字串參數,則在"test string"(測試字串)不出錯的情況下函式將返回被測字串本身。若省略"error"(錯誤)字串參數,則函式將在被測字串出錯時返回空字串:

{{#iferror: {{#expr: 1 + 2 }} | error | correct }}correct
{{#iferror: {{#expr: 1 + X }} | error | correct }}error
{{#iferror: {{#expr: 1 + 2 }} | error }}3
{{#iferror: {{#expr: 1 + X }} | error }}error
{{#iferror: {{#expr: 1 + 2 }} }}3
{{#iferror: {{#expr: 1 + X }} }}
{{#iferror: {{#expr: . }} | error | correct }}correct
{{#iferror: <strong class="error">a</strong> | error | correct }}error

Some errors may cause a tracking category to be added, using {{#iferror:}} will not suppress the addition of the category.

#ifexpr

此函式會判斷數學表達式並根據其布林值結果返回對應的字串:

{{#ifexpr: expression | value if true | value if false }}

這裡"expression"輸入串將原封不動的作為上面#expr的參數進行呼叫,且表達式運算子是通用的,返回值也將作為布林表達式進行處理。

輸入表達式為空時將視為false

{{#ifexpr: | yes | no}}no

如上面所提,0將視為false,非零值將視為true,因此這個函式與下面的僅用#ifeq#expr的表述等價:

{{#ifeq: {{#expr: expression }} | 0 | value if false | value if true }}

除了下面這種情況:所輸入表達式為空或者是一個錯誤表達式(空字串會返回一條錯誤資訊,而它不等於0,所以在後者我們會得到"value if true")。

{{#ifexpr: = | yes | no }} 表達式錯誤:預期外的=運算子。

相對的

{{#ifeq: {{#expr: = }} | 0 | no | yes }} yes

兩個返回值都可以省略,當合適的對應分支被省略時,函式不輸出:

{{#ifexpr: 1 > 0 | yes }}yes
{{#ifexpr: 1 < 0 | yes }}
{{#ifexpr: 0 = 0 | yes }} yes
{{#ifexpr: 1 > 0 | | no}}
{{#ifexpr: 1 < 0 | | no}} no
{{#ifexpr: 1 > 0 }}

Boolean operators of equality or inequality operators are supported.

{{#ifexpr: 0 = 0 or 1 = 0 | yes}}yes
{{#ifexpr: 0 = 0 and 1 = 0 | | no}}no
{{#ifexpr: 2 > 0 or 1 < 0 | yes}}yes
{{#ifexpr: 2 > 0 and 1 > 0 | yes | no}}yes

#ifexist

這個函式將一組字串作為輸入,並翻譯成頁面標題,然後根據在本地wiki上是否存在該頁面而返回對應的值。

{{#ifexist: page title | value if exists | value if doesn't exist }}

只要頁面存在就會判定為true(真值),即便那個頁面看上去是空白的(比如像是分類連結或者是魔術字解釋頁之類的卻不包含任何可視內容的頁面),或者是重新導向頁面,或者它就是空白頁。若且唯若頁面是紅色連結時判定為false(假值),包括那些曾經存在卻被刪除的頁面。

{{#ifexist: Help:解析器函数 | exists | doesn't exist }}exists
{{#ifexist: XXHelp:解析器函数XX | exists | doesn't exist }}doesn't exist

函式在系統訊息被自訂時返回true,對特殊頁面的判定則取決於本地軟體自身。

{{#ifexist: Special:监视列表 | exists | doesn't exist }}exists
{{#ifexist: Special:用户查核 | exists | doesn't exist }}exists (因為nsp=0擴充已經安裝於此wiki)
{{#ifexist: MediaWiki:Copyright | exists | doesn't exist }}exists (因為MediaWiki:Copyright已自訂)

如果一個頁面使用了#ifexist:來檢查目標頁面,則這個檢查頁面將出現在被檢查頁面的Special:連入頁面里。所以如果本頁面(Help:解析器函式)使用了代碼 {{#ifexist:Foo}},那麼Special:連入頁面/Foo將列出Help:解析器函式。

若wiki有其在使用的對應的共享媒體庫,#ifexist:就可用於檢查一個檔案是否在媒體庫中,而不僅僅只是在wiki本體上檢查:

{{#ifexist: File:Example.png | exists | doesn't exist }}exists
{{#ifexist: Image:Example.png | exists | doesn't exist }}exists
{{#ifexist: Media:Example.png | exists | doesn't exist }}exists

如果檔案有一個已建立的對應的本地描述頁面,上面的結果將全部是exists

#ifexist:不會對跨站連結起作用。

ifexist 限制

#ifexist:被視為「高開銷(expensive)解析器函式」,每個頁面呼叫這類函式的次數(包括包含於嵌入式模板的函式)存在一個限制。 當達到該限制時,更多的#ifexist:函式,無論其目標頁面是否存在,只會自動返回錯誤值false,且該頁面會被分類到Category:有過多高開銷解析器函式呼叫的頁面中。 追蹤分類的名稱可能因您的wiki內容的語言而異。

一些情況下,在css中使用選擇器a.new(以選出連結到不存在的頁面的連結)或者是a:not(.new)(以選出已存在頁面的連結),是可以達到模仿ifexist的效果的。 另外,$wgExpensiveParserFunctionLimit可以調整對高開銷解析器函式數量的限制,如果有需要,也可以增加頁面LocalSettings.php中的限制值。

ifexisit和需要的頁面

一個不存在的頁面被#ifexist檢測後會被計數在待建立頁面中。

#rel2abs

這個函式將檔案的相對路徑轉換為絕對路徑。

{{#rel2abs: path }}
{{#rel2abs: path | base path }}

在輸入項path中,可以使用以下類型的句法:

  • . → 本級路徑
  • .. → 回到上一級
  • /foo → 向下一級進入子目錄/foo

base path沒有指定,將預設的填入函式所在頁面的絕對路徑:

{{#rel2abs: /quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ./quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ../quok | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../. | Help:Foo/bar/baz }}Help:Foo/bar

無效語法,如/././,將被忽略。 由於不允許超過兩個連續的句號,因此可以使用諸如此類的序列來分隔連續的語句:

{{#rel2abs: ../quok/. | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../../quok | Help:Foo/bar/baz }}Help:Foo/quok
{{#rel2abs: ../../../quok | Help:Foo/bar/baz }}quok
{{#rel2abs: ../../../../quok | Help:Foo/bar/baz }}錯誤:路徑深度無效:「Help:Foo/bar/baz/../../../../quok」(試圖存取根節點之上的節點)。

For a similar group of functions see also Help:Magic words#URL data. Built-in parser functions include: 'localurl:', 'fullurl:', 'anchorencode:' etc.

#switch

該函式將一個輸入值同若干個測試用例(test cases)做比較,如果找到匹配,返回有關聯的字串。

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

例如:

{{#switch: baz | foo = Foo | baz = Baz | Bar }} Baz
{{#switch: foo | foo = Foo | baz = Baz | Bar }} Foo
{{#switch: zzz | foo = Foo | baz = Baz | Bar }} Bar

含有部分嵌入包含標記的#switch會影響到能讓不熟悉模板代碼的編輯者檢視和編輯可組態元素的設定檔。

預設

如果comparison string不能與任何case匹配,則返回default result

{{#switch: test | foo = Foo | baz = Baz | Bar }} Bar

在這種語法中,預設返回值必須是函式的最後一個參數,而且不能包含原始等號(不帶{{}}的等號)。 否則,就會解析為樣例比較,無匹配的樣例時不顯示文字。 這是因為預設值沒有定義(是空的)。 如果有樣例匹配,則返回關聯的字串。

{{#switch: test | Bar | foo = Foo | baz = Baz }} →
{{#switch: test | foo = Foo | baz = Baz | B=ar }} →
{{#switch: test | test = Foo | baz = Baz | B=ar }} → Foo

你也可以將case字串設為#default從而清楚地聲明預設值。

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

這種方式聲明的預設結果可以放在函式的任何地方:

{{#switch: test | foo = Foo | #default = Bar | baz = Baz }} Bar

如果"default"參數被省略,且沒有找到匹配,則不返回結果:

{{#switch: test | foo = Foo | baz = Baz }}

分組結果

該函式允許有「跌落」值,多個"case"字串返回相同的"result"字串,從而減少重複。

{{#switch: comparison string
 | case1 = result1
 | case2 
 | case3 
 | case4 = result234
 | case5 = result5
 | case6 
 | case7 = result67
 | #default = default result
}}

在本例中,第二、三、四個分支都會返回"result234",第六和第七個分支都會返回"result67"。 上述案例中,最後一個參數中的「#default = 」可以省略。

帶有參數使用

該函式允許將參數用作測試字串。 在本例中,不必將管道符放在參數名稱後面,因為你不太可能需要選擇字串「{{{parameter name}}}」作為樣例。 ((如果沒有管道符,且參數不存在或沒有值,則參數就會顯示為這樣。) 參見Help:Parser functions in templates。)

{{#switch: {{{1}}} | foo = Foo | baz = Baz | Bar }}

上面的例子中,如果{{{1}}}等於foo,函式返回Foo。 如果等於baz,函式返回Baz。 如果參數是空的或者不存在,函式返回Bar

上面的這些中,也可以將樣例組合起來以返回單個結果。

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | Bar }}

如果{{{1}}}等於foozooroo,函式返回Foo。 如果等於baz,函式返回Baz。 如果參數是空的或者不存在,函式返回Bar

而且,如果你希望在測試參數不能匹配任何樣例時不返回任何內容,可以省略預設結果。

{{#switch: {{{1}}} | foo = Foo | bar = Bar }}

在本例中,如果{{{1}}}存在且等於foobar,則分別返回FooBar,否則不返回任何內容。

這樣做相當於將預設值聲明為空。

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | }}

如果由於某些原因需要將樣例設定為{{{parameter name}}},則函式在參數不存在或沒有值的情況下返回該樣例的結果。 參數需要存在且擁有不同於字串「{{{parameter name}}}」的值以返回函式的預設結果。

(若{{{1}}}不存在或者是空的):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo
(若{{{1}}}的值為test):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Bar
(若{{{1}}}的值為「{{{1}}}」):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo


在這樣的例子中,你需要給參數添加管道符({{{1|}}})。

比較行為

如同#ifeq那樣,若被比較字串和測試用例字串都是數字,那麼按照數值進行比較;反之若存在一個非純數字串,都會按照字串比較規則進行:

{{#switch: 0 + 1 | 1 = one | 2 = two | three}} → three
{{#switch: {{#expr: 0 + 1}} | 1 = one | 2 = two | three}} → one
{{#switch: a | a = A | b = B | C}} → A
{{#switch: A | a = A | b = B | C}} → C

case字串可以是空的:

{{#switch: | = Nothing | foo = Foo | Something }}Nothing

只要找到一個匹配,後面的case都會忽略:

{{#switch: b | f = Foo | b = Bar | b = Baz | }}Bar

原始等號

「case」字串不能包含原始等號。如果需要在比較串中加入等號,可以使用僅包含一個等號的模板模板連結:{{=}}來代替=,或者是用HTML標識碼&#61;來代替。

例如:

您輸入的 您輸出的
{{#switch: 1=2
 | 1=2 = raw
 | 1<nowiki>=</nowiki>2 = nowiki
 | 1{{=}}2 = template
 | default
}}
template
{{#switch: 1=2
 | 1&#61;2 = html
 | default
}}
html

替換#ifeq

#switch可以用於減少擴充深度

例如:

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

等效於

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

也就是線性的深度迭代判斷:

{{#ifeq:{{{1}}}|condition1
  |<!--then-->branch1
  |<!--else-->{{#ifeq:{{{1}}}|condition2
                |<!--then-->branch2
                |<!--else-->{{#ifeq:{{{1}}}|condition3
                              |<!--then-->branch3
                              |<!--else-->branch4}}}}}}

另一方面,對於巢狀在兩個分支中的if(以縮排形式呈現,兩側都縮排),替換成switch可能很複雜/不切實際,從而形成對稱樹:

{{#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
    }}
  }}
}}

#time

該解析器函式接收一個(公曆的)日期或者時間,並根據給定的語法將其格式化。可以指定日期/時間對象,預設則為魔術字Help:魔術字#Date and time的當前值——也就是說,頁面最後被彩現為HTML時的時間。

{{#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 }}

右表列舉了支持的格式化代碼。任何不被辨識的格式化字串都不會被修改,這同樣適用於空白字元(系統不使用空白字元來解釋代碼)。格式化字串內有兩種方法來跳脫字元:

  1. 反斜槓後跟隨一個格式化字串會被解釋為單個原始的字元
  2. 用英文雙引號括起來的字元視為原始字元,引號將被移除。

此外,xx會被解釋為單個原始的x。

由于格式化代碼列表會持續發展(支持新日曆,或支持以不同方式計算和格式化的新日期欄位),您應該跳脫所有需要傳入而保持不變的文字字元(不僅僅是格式化代碼當前使用的ASCII字母)。

不幸的是,目前,ASCII單引號仍未被視為當前已經受支持的ASCII雙引號(可標記文字文字)和反斜槓(在許多語言使用的字串常數中也必須跳脫,包括JSON、C、C++、PHP、JavaScript、Lua)的簡單替代方法(例如,雙引號在其他用途​​中是強制性的,例如JSON、C、C++等語言中的字串值的定界)。 因此,您仍然無法在不使用反斜槓跳脫的情況下嵌入任何文字雙引號(或者也可以使用其他彎引號、角形引號或方引號)。

{{#time: Y-m-d }}2024-04-23
{{#time: [[Y]] m d }}2024 04 23
{{#time: [[Y (year)]] }}2024 (24UTCamTue, 23 Apr 2024 10:49:00 +0000)
{{#time: [[Y "(year)"]] }}2024 (year)
{{#time: i's" }}49'00"

date/time object可以是任何PHP strtotime()函式接受的格式。 絕對(如20 December 2000)、相對(如+20 hours)和混合時間(如30 July +1 year)格式均是可以的。

{{#time: r|now}}Tue, 23 Apr 2024 10:49:00 +0000
{{#time: r|+2 hours}}Tue, 23 Apr 2024 12:49:00 +0000
{{#time: r|now + 2 hours}}Tue, 23 Apr 2024 12:49:00 +0000
{{#time: r|20 December 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|December 20, 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000-12-20}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000 December 20}}錯誤:時間無效。

ISO 639-3(?)中的language code允許字串顯示為指定語言。

{{#time:d F Y|1988-02-28|nl}}28 februari 1988
{{#time:l|now|uk}}вівторок
{{#time:d xg Y|20 June 2010|pl}}20 czerwca 2010

local參數指定date/time object是指本地時區還是UTC時間。

這是一個布林參數,其值是透過轉換(casting)參數值來確定的(有關如何將字串轉換為布林值的詳細資訊,請參閱官方PHP文件)。

請注意,如果$wgLocaltimezone設為UTC,則當local設為truefalse時輸出無區別。

參考下面的詳細範例:

{{#time: Y F d H:i:s|now|it|0}}2024 aprile 23 10:49:01
{{#time: Y F d H:i:s|now|it|1}}2024 aprile 23 18:49:01
{{#time: Y F d H:i:s|+2 hours||0}}2024 4月 23 12:49:01
{{#time: Y F d H:i:s|+2 hours||1}}2024 4月 23 20:49:01
{{#time:c|2019-05-16T17:05:43+02:00|it}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|0}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|true}}2019-05-16T23:05:43+08:00

如果你已經計算了Unix時間戳,你可以透過添加@符號字首來在日期計算中使用。

{{#time: U | now }}1713869341
{{#time: r | @1713869340 }}Tue, 23 Apr 2024 10:49:00 +0000

可以指定完整的或部分絕對的日期;函式會使用「當前」值「填充」日期中未被指定的部分。

{{#time: Y | January 1 }}2024

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

{{#time: Y m d H:i:s | 1959 }}1959 04 23 00:00:00

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

{{#time: Y m d H:i:s | 195909 }}2024 04 23 19:59:09 輸入被視為時間而不是年+月代碼。
{{#time: Y m d H:i:s | 196009 }}錯誤:時間無效。 雖然19:60:09不是有效時間,但196009不被解讀為1960年9月。

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

{{#time: d F Y | January 0 2008 }}31 12月 2007
{{#time: d F | January 32 }}錯誤:時間無效。
{{#time: d F | February 29 2008 }}29 2月
{{#time: d F | February 29 2007 }}01 3月
{{#time:Y-F|now -1 months}}2024-3月

#time調用的格式字串的總長度限制為6000個字元。

時區問題

#time解析器函式有個bug(尤其是PHP DateTime),不允許傳入非整數的相對時區偏移。這個問題不適用於使用基於小時的時區,例如EDT。例如:

  • {{#time:g:i A | -4 hours }} → 6:49 AM

但是,印度(India)是UTC +5.5個小時的時間偏移,因此使用時區不會正常地計算相對時區偏移。因此:

  • {{#time:g:i A | +5.5 hours }} → 10:49 AM

要解決這個問題,可將時間簡單轉換為分鐘或者秒,像這樣:

  • {{#time:g:i A | +330 minutes }} → 4:19 PM
  • {{#time:g:i A | +19800 seconds }} → 4:19 PM

(Tim Starling,該函式的開發者,提供了該解決方案的準確語法。)

#timel

該函式等價於{{#time: ... }},其中local偏好設定為true,因此總是使用wiki的本地時間($wgLocaltimezone中設定的)。

該函式的語法為:

{{#timel: format string }}
{{#timel: format string | date/time object }}
{{#timel: format string | date/time object | language code }}
請注意,如果變數$wgLocaltimezone設為UTC,則當local設為truefalse時輸出無區別。
使用#time和#timel解析器函式的範例,其中伺服器處於非UTC時區

例如,參考以下範例:

{{#time:c|now|it}}2024-04-23T10:49:01+00:00
{{#time:c|now|it|0}}2024-04-23T10:49:01+00:00
{{#time:c|now|it|1}}2024-04-23T18:49:01+08:00
{{#timel:c|now|it}}2024-04-23T18:49:01+08:00
https://no.wikipedia.org/wiki/Maldiskusjon:Sommertid的警告範例

#titleparts

此函式將頁面標題根據斜槓劃分成多個分段,然後輸出返回這些分段中的部分。

{{#titleparts: 頁面名稱 | 需要返回的分段數量 | 要返回的第一個分段 }}

如果沒有指定要返回的分段數量參數,則預設為「0」,會從要返回的第一個分段(包含)開始返回所有分段。如果要返回的第一個分段參數沒有指定或者為「0」,則預設為「1」。

{{#titleparts: Talk:Foo/bar/baz/quok }}Talk:Foo/bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | 1 }}Talk:Foo See also {{ROOTPAGENAME}}.
{{#titleparts: Talk:Foo/bar/baz/quok | 2 }}Talk:Foo/bar
{{#titleparts: Talk:Foo/bar/baz/quok | 2 | 2 }}bar/baz
{{#titleparts: Talk:Foo/bar/baz/quok | | 2 }}bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | | 5 }}

兩個值都接受負值。要返回的分段數量參數的負值會從字串的最後開始「剝離」分段。要返回的第一個分段參數的負值解釋為「從這一分段開始,從右邊開始計數」:

{{#titleparts: Talk:Foo/bar/baz/quok | -1 }}Talk:Foo/bar/baz 從字串的末尾剝離一段 參見{{BASEPAGENAME}}。
{{#titleparts: Talk:Foo/bar/baz/quok | -4 }} 從字串的末尾剝離所有4段
{{#titleparts: Talk:Foo/bar/baz/quok | -5 }} 從字串的末尾剝離5段(多於已存在的)
{{#titleparts: Talk:Foo/bar/baz/quok | | -1 }} quok 返回最後一段。 參見{{SUBPAGENAME}}。
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | 2 }} bar/baz 從字串的末尾剝離一段,然後返回第二段及以後的段
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | -2 }} baz 從倒數第二個元素開始複製;從字串的末尾剝離一段

處理前,頁面名稱參數是HTML解碼的:如果包含一些標準的HTML字元實體,將被轉換為純字元(內部使用UTF-8編碼,也就是與使用解析器函式的MediaWiki源頁面中的編碼相同)。

例如,頁面名稱中出現了&quot;&#34;&#x22;的地方,都會替換為"
不會執行從HTML到純文字的其他轉換,因此即使HTML標籤在頁面標題中無效,在此初始步驟中也會保持不變。

解碼後的頁面名稱會儘可能標準化為MediaWiki支持的標準頁面名稱:

  1. 所有底線都自動替換為空格:
    {{#titleparts: Talk:Foo/bah_boo|1|2}}bah boo 不是bah_boo,儘管原來的內容有底線。
  2. 字串最多分割25此;更多的斜槓都會忽略,第25個元素將會包含字串的剩餘內容。 字串也限制在255個字元內,因為要被視為頁面標題
    {{#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 }}y/z/aa/bb/cc/dd/ee
    如果出於某些原因確實要將此函式推到極限(儘管不太可能),可以透過巢狀函式呼叫來繞過只能分割25此的限制:
    {{#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}}z
  3. 最後,第一個子字串根據本地wiki的大小寫設定進行大寫(如果該子字串也以本地命名空間名稱開頭,則該命名空間名稱也被標準化)。
    {{#titleparts: talk:a/b/c }}Talk:A/b/c


字串函式

所有這些函式(len, pos, rpos, sub, replace, explode)都融合在了StringFunctions擴充中,但是只有在管理員在LocalSettings.php中啟用了$wgPFEnableStringFunctions = true;的情況下才能使用。

所有這些函式都以O(n)的時間複雜度執行,使其能夠抵禦DoS攻擊。

  1. 這些函式的部分參數透過全域設定進行限制,以防止濫用。 參見後面的限制段落。
  2. 對於區分大小寫的函式,在某些情況下,可以使用魔術字{{lc:string}}來解決。
  3. 要確定MediaWiki伺服器是否啟用這些功能,請檢查Special:Version中支持的擴充解析器函式列表。
  4. 字串長度限制為$wgPFStringLengthLimit變數,預設為1000

#len

#len解析器函式是在1.2.0版本從nsp=0擴充合併的。

#len函式返回指定字串的長度。 語法為:

{{#len:string}}

返回值始終是源string中的字元數量(擴充模板呼叫之後、轉換為HTML之前的字元數量)。 如果未指定字串,則返回值為零。

  • 此函式可安全處理UTF-8多位元組字元。 例如:
    • 88
  • 前導和尾隨的空格或換行不計算在內,但會考慮中間的空格和換行。 例如:
    • 88
    • 205 - 2個字元之間3個空格
  • 透過引用給出的字元不會轉換,而是根據其源格式進行計數。
    • 106 - 命名的字元引用
    • 95 - 數字字元引用,不被忽略,儘管它在此處指定了一個空格。
  • <nowiki>和其他標籤擴充的長度總是為零,因為這些內容對解析器而言是隱藏的。 例如:
    • 374

#pos

#pos解析器函式是在1.2.0版本從nsp=0擴充合併的。

#pos函式返回給定搜尋詞在字串中的位置。 語法為:

{{#pos:string|搜索词|offset}}

offset參數如果指定了,則會表明函式應該開始搜尋的起始位置。

如果找到了搜尋詞,則返回的值是字串string中的位置(從0開始數)。

如果沒有找到搜尋詞,函式返回空字串。

  • 該函式是大小寫敏感的。
  • 搜尋詞允許的最大長度限制取決於全域設定$wgStringFunctionsLimitSearch
  • 此函式可安全處理UTF-8多位元組字元。 範例: {{#pos:Žmržlina|žlina}}返回3。
  • #len一樣,<nowiki>和其他標籤擴充在計算字元位置時都被視為長度為1。 例如: {{#pos:<nowiki>This is a </nowiki>test|test}}返回1。

#rpos

#rpos解析器函式是在1.2.0版本從nsp=0擴充合併的。

#rpos函式返回給定搜尋詞在字串中的最後位置。 語法為:

 {{#rpos:string|搜索词}}

如果找到了搜尋詞,則返回的值是字串string中的最後位置(從0開始數)。

如果沒有找到搜尋詞,函式返回-1。

使用该函数搜索最后一个分隔符时,给结果添加+1以检索最后一个分隔符之后的位置。 这在找不到分隔符时也有效,因为“-1 + 1”为零,也就是指定值的开头。 → 使用該函式搜尋最後一個分隔符時,給結果添加+1以檢索最後一個分隔符之後的位置。 這在找不到分隔符時也有效,因為「-1 + 1」為零,也就是指定值的開頭。

  • 該函式是大小寫敏感的。
  • 搜尋詞允許的最大長度限制取決於全域設定$wgStringFunctionsLimitSearch
  • 此函式可安全處理UTF-8多位元組字元。 例如: {{#rpos:Žmržlina|lina}}返回4。
  • #len一樣,<nowiki>和其他標籤擴充在計算字元位置時都被視為長度為1。 例如: {{#rpos:<nowiki>This is a </nowiki>test|test}}返回1。

#sub

#sub解析器函式是在1.2.0版本從nsp=0擴充合併的。

#sub函式返回指定字串中的子字串(substring)。 語法為:

{{#sub:string|start|length}}

start參數,如果為正(或者零),則會指定要返回的第一個字元的索引(從0開始數)。

例如: {{#sub:Icecream|3}}返回cream

{{#sub:Icecream|0|3}}返回Ice

如果start參數為負,則指定要返回從末尾開始的多少個字元。

例如: {{#sub:Icecream|-3}}返回eam

length參數,如果存在且為正數,則會指定返回的字串的最大長度。

例如: {{#sub:Icecream|3|3}}返回cre

如果length參數為負,則指定忽略從末尾開始的多少個字元。

例如: {{#sub:Icecream|3|-3}}返回cr

如果start參數為負,則指定要返回從末尾開始的多少個字元。 length參數,如果存在且為正數,則會指定返回的字串從開始點開始的最大長度。

例如: {{#sub:Icecream|-3|2}}返回ea

  • 如果length參數為零,則完全不會用於截斷。
    • 例如: {{#sub:Icecream|3|0}}返回cream{{#sub:Icecream|0|3}}返回Ice
  • 如果start表示一個超出了由負的length參數從末尾截斷的位置,則將返回一個空字串。
    • 例如: {{#sub:Icecream|3|-6}}返回空字串
  • 此函式可安全處理UTF-8多位元組字元。 例如: {{#sub:Žmržlina|3}}返回žlina
  • #len一樣,<nowiki>和其他標籤擴充在計算字元位置時都被視為長度為1。 例如: {{#sub:<nowiki>This is a </nowiki>test|1}}返回test

#count

#count解析器函式是在1.2.0版本添加到nsp=0擴充中的。

#count函式返回指定子字串在提供的文字中出現的次數。

{{#count:string|substring}}

#replace

#replace解析器函式是在1.2.0版本從nsp=0擴充合併的。

#replace函式返回指定的字串,並將所有搜尋詞出現的地方替換成替換詞。

{{#replace:string|search term|replacement term}}

如果search term未指定或者為空,則搜尋單個空格。

如果replacement term未指定或者為空,則所有search term都會從string中移除。

  • 該函式是大小寫敏感的。
  • search term允許的最大長度限制取決於全域設定$wgStringFunctionsLimitSearch
  • replacement term允許的最大長度限制取決於全域設定$wgStringFunctionsLimitReplace
  • 即使replacement term是空格,也會使用空字串。 * 這是MediaWiki解析器的副作用。 如要在replacement term中使用空格,將其放在nowiki標籤中。
    • 例如: {{#replace:My_little_home_page|_|<nowiki> </nowiki>}}返回My little home page
    • 如果不起作用,嘗試使用帶有兩個自我閉合標籤的{{#replace:My_little_home_page|_|<nowiki/> <nowiki/>}}
    • 注意在替換詞中這是唯一可以使用nowiki的地方',因為其他的nowiki都會被用來繞過$wgStringFunctionsLimitReplace,將任意大量的字串注入到輸出中。 因此,在替換詞中所有出現<nowiki>或其他標籤擴充的地方都會替換為空格。
  • 此函式可安全處理UTF-8多位元組字元。 例如: {{#replace:Žmržlina|ž|z}}返回Žmrzlina
  • 如果單個文字字串中的多個項都要替換,可以考慮Extension:ReplaceSet。 該擴充會添加一個空餘替換序列的解析器函式。
忽略大小寫的替換

當前該語法不提供開關大小寫敏感設定的選項。 但你可以使用格式化的魔術字來解決。 (例如,{{lc:你的字符串}}) 例如,如果想從字串中刪除單詞「Category:」而不管其大小寫,可以輸入:

{{#replace:{{lc:{{{1}}}}}|category:|}}

但缺點就是輸出的都會變成小寫。 如果想在替換後保留大小寫,則必須使用多個巢狀級別(即多次替換呼叫)來實現相同的目的。

#explode

#explode解析器函式是在1.2.0版本從nsp=0擴充合併的。

#explode函式將指定的字串分成多個片段,返回其中一段。 語法為:

{{#explode:string|delimiter|position|limit}}

delimiter參數指定一個用來將string劃分成段的字串。 這個delimiter字串不是任何片段的一部分,如果有兩個delimiter彼此相鄰,會在二者之間建立一個空片段。 如果該參數未指定,則使用單個空格。 limit參數僅在解析器函式中可用,在獨立的字串函式版本中不可用,允許你限制返回的部分的數量,所有剩餘文字都包含在最終部分中。

position參數指定了返回哪一個片段。 片段是從0開始數的。 如果參數未指定,則使用第一個片段(數字0的片段)。 如果position使用負值,則片段會從最後開始數。 這種情況下,第-1個片段表示最後一段。 例如:

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

返回的值是第position個片段。如果片段數量少於position指定的,則返回空字串。

  • 該函式是大小寫敏感的。
  • delimiter允許的最大長度限制由全域設定$wgStringFunctionsLimitSearch指定。
  • 該函式可以安全處理UTF-8多位元組字元,例如{{#explode:Žmržlina|ž|1}}返回lina

#urldecode

#urldecode將「URL編碼的跳脫字元轉換回原來的可讀字元。語法為:

{{#urldecode:值}}

注意:

  • 該函式是透過直接暴露PHP的urldecode()函式來運作的。
  • 字元代碼參考可參見www.w3schools.com
  • 與此相反的urlencode,已經融合在了MediaWiki的1.18版本中,具體範例可參見使用說明:魔術字。
  • urldecode是在2010年從字串函式透過commit 1b75afd18d3695bdb6ffbfccd0e4aec064785363合併的。

限制

本模組定義三個全域設定:

這些用於限制一些函式的部分參數以確保函式在O(n)時間複雜度內執行,因此可避免Dos攻擊,確保安全。

$wgStringFunctionsLimitSearch

#pos#rpos#replace#explode都使用了此設定。所有這些函式在執行時都會在更大的字串中搜尋子字串,這可以在O(n*m)內執行,因此使軟體更容易受到DoS攻擊。將此值設定為特定的更小的數,可將時間複雜度降低到O(n)。

此設定限制了所搜尋字串的最大允許長度。

預設值為30個多位元組字元。

$wgStringFunctionsLimitReplace

#replace使用了此設定。此函式將一個字串的所有出現的地方替換為另一個字串,這樣將能夠快速生成非常大量的資料,因此使軟體更容易受到DoS攻擊。此設定限制了替換字串的最大允許長度。

預設值為30個多位元組字元。

一般幫助

替換引用

在井號前面添加subst:可以將字串函式替換引用

{{subst:#ifexist: Help:解析器函数 | [[Help:解析器函数]] | Help:解析器函数 }} → 將在文字中插入代碼[[Help:解析器函数]],因為Help:解析器函式存在。

<ref>open…</ref></ref>內的替換引用不起作用,如要使用,可以使用{{subst:#tag:ref|}}

重新導向

特別地,{{#time:…|now-…}}可以方便地重新導向到包含日期的頁面,但這不起作用。

在表格中跳脫管道符

解析器函式會破壞wikitable語法和管道字元(|),將所有的原始管道字元視為參數分隔符。 為了避免這個,很多wiki使用模板Template:!,其內容僅為一個管道符(|),自MediaWiki 1.24開始被{{! 魔術字}}取代。 這會從MediaWiki解析器中「隱藏」管道符號,確保在展開頁面上的所有模板和變數之前不考慮它。 然後將被解釋為表格的行或列分隔符。 你也可以使用原始的HTML表格語法,儘管這並不直觀而且容易出錯。

對於需要顯示的管道字元,可以使用HTML實體進行跳脫,顯示為純粹的、未被解釋的字元:&#124;

說明 您輸入的 您輸出的
將管道字元跳脫為表格行/列分隔符
{{!}}
|
將管道字元跳脫為純字元
&#124;
|


除去空白字元

空白字元(whitespace),包括換行字元、制表符和空格,在這些解析器函式的所有參數的開頭和結尾處,都會被除去。如果不希望這樣,可以將字串放在引號中後進行比較。

{{#ifeq: foo           |           foo | equal | not equal }}equal
{{#ifeq: "foo          " | "          foo" | equal | not equal }}not equal

要避免修整then和else部分,一些人為達到目的,會使用<nowiki> </nowiki>而非空格。

foo{{#if:|| bar }}foofoobarfoo
foo{{#if:||<nowiki /> bar <nowiki />}}foofoo bar foo

然而,這種方法只能用於彩現單個空白字元,因為解析器函式會將一行中的多個空白字元擠壓成一個。

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

在本例中,white-space: pre樣式用來強制瀏覽器保留空白,但即使使用它,也不會顯示空格。發生這種情況是因為這些空格在傳送到瀏覽器之前,就已經被軟體除去了。

要解決此問題,可以將空白字元替換為&#32;可折行空格)或者&nbsp;不可折行空格),因為這些字元不會被軟體修改:

<span style="white-space: pre;">foo{{#if:||&#32;&#32;&#32;bar&#32;&#32;&#32;}}foo</span>foo bar foo
foo{{#if:||&nbsp;&nbsp;&nbsp;bar&nbsp;&nbsp;&nbsp;}}foofoo   bar   foo

請注意,不是所有的參數都是一樣的。在解析器函式中,開頭和結尾的空白總是被剝離。在模板中,命名的參數和命名的非命名參數的開頭和結尾的空白會被剝離,但非命名的參數則不會。

foo模板链接:{{1x|content= bar }}foofoo{{{1}}}foo
foo模板链接:{{1x|1= bar }}foofoobarfoo
foo模板链接:{{1x| bar }}foofoo bar foo

參見