本頁使用了標題或全文手工轉換

幫助:解析器函數

來自維基學院
跳至導覽 跳至搜尋
捷徑
H:PF
H:FUNC

解析器函數是由一個MediaWiki擴展mw:Extension:ParserFunctions提供,包含多個解析函數解釋器。本擴展的典型語法是:

{{#函數名:參數1|參數2|參數3|...}}

目前有預定義的函數:exprififeqiexprswitchrand暫時被廢除)。

各函數名都對大小寫不敏感。

語句中的空格、換行等空白字符將被省略。

函數[編輯 | 編輯原始碼]

expr[編輯 | 編輯原始碼]

expr函數,計算數學表達式。語法為:

{{#expr:表達式}}

表達式支持的運算符有:

運算符 名稱 優先級 元數 結合性 樣例
+ 9 1 {{#expr:+ 7}} = 7
- 9 1 {{#expr:- 7}} = -7
not 邏輯非 9 1 {{#expr:not 7}} = 0
* 8 2 {{#expr:30 * 7}} = 210
/ 8 2 {{#expr:30 / 7}} = 4.2857142857143
div 8 2 {{#expr:30 div 7}} = 4.2857142857143
mod 8 2 {{#expr:30 mod 7}} = 2
+ 6 2 {{#expr:30 + 7}} = 37
- 6 2 {{#expr:30 - 7}} = 23
round 捨入(最大9) 5 2 {{#expr:30 / 7 round 7}} = 4.2857143
= 等於 4 2 {{#expr:{{{2}}}}} = 0
< 小於 4 2 {{#expr:30 < 7}} = 0
> 大於 4 2 {{#expr:30 > 7}} = 1
<= 小於等於 4 2 {{#expr:{{{2}}}}} = 0
>= 大於等於 4 2 {{#expr:{{{2}}}}} = 1
<> 不等於 4 2 {{#expr:30 <> 7}} = 1
!= 不等於 4 2 {{#expr|30 != 7}} = 1
and 邏輯與 3 2 {{#expr:30 and 7}} = 1
or 邏輯或 2 2 {{#expr:30 or 7}} = 1

round運算對運算數正負,位數正負都有不同的表現,參見下例。

邏輯運算符把假映射為0,把真映射為非0,且返回值只有0或1。

同一表達式中先計算高優先級運算。括號優先級高於一切。

if[編輯 | 編輯原始碼]

if函數是一個if-then-else(如果、那麼、否則)結構,和Excelif函數類似。語法是:

{{#if:判斷字符串|那麼字符串|否則字符串}}
{{#if:判斷字符串|那麼字符串}}

若判斷字符串為非空字符串(忽略前導或後綴空格),則函數返回那麼字符串;若判斷字符串是空字符串,則返回否則字符串。否則字符串可被省略而不會造成錯誤,但函數在判斷字符串為空時便會返回空字符串。

ifeq[編輯 | 編輯原始碼]

ifeq比較兩個字符串,返回比較結果。語法為:

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

注意:兩個空字符串是相等的。

示例:

假設模板{{Ifeq test}}的內容是

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

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

ifexist[編輯 | 編輯原始碼]

ifexist根據指定名稱的頁面是否存在,返回兩個參數中的一個。用法:

{{#ifexist:待測頁面標題|存在文字|不存在文字}}

注意不能跨維基使用。

ifexist是一個高開銷方法,如果超過調用次數限制,超出部分的調用默認為輸出不存在時的內容。

示例:

首先,我們已經知道test頁面不存在,User:用戶名不存在,維基百科頁面存在,英文維基百科的頁面en:Minecraft存在,維基詞典裡面wikt:hello存在。

  • {{#ifexist:test|有test頁面|無test頁面}} → 無test頁面
  • {{#ifexist:User:用戶名|該用戶頁存在|該用戶頁不存在}} → 該用戶頁不存在
  • {{#ifexist:維基百科||}}
  • {{#ifexist:en:Minecraft|1|0}} → 0
  • {{#ifexist:wikt:hello|1|0}} → 0

ifexpr[編輯 | 編輯原始碼]

ifexpr計算數學表達式,並根據計算結果返回字符串。

{{#ifexpr:表達式|表達式不為0的結果|表達式為0的結果}}

表達式語法與expr相同。

switch[編輯 | 編輯原始碼]

switch將一個值與多個預設值比較,若有匹配時則返回指定字符串,即雙射。語法是:

{{#switch:比較值
|預設值1 = 結果1
|預設值2 = 結果2
|...
|預設值n = 結果n
|#default = 缺省結果
}}

switch將從左往右逐一嘗試,直到出現匹配。函數將返回第一個匹配值對應的結果,而忽略後面的匹配值。如果沒有匹配,函數將返回缺省結果。缺省結果是指的#default=後面的內容。其中#default=在結果不包含等號時是可以省略的。如果缺省結果沒有設置,函數將返回空串。

注意:「缺省結果」是最後一個沒有等號的預設值或「#default」預設值對應的結果;如果期望把一個包含「=」號的字符串作為缺省結果,則必須採用「#default」預設值形式。例如:

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

switch也可用作滿射(多對一,避免重複設置結果)。即某預設值後未設置結果,這樣如果該預設值與比較值匹配,則函數返回第一個有結果的預設值的結果。例如:

{{#switch:比較值
|預設值1
|預設值2
|預設值3 = 結果3
|缺省結果
}}

如果比較值與預設值1、預設值2或預設值3匹配,都將返回結果3。注意:「#default」後必須有「=」,但其他預設值可以使用「#default」的結果。

switch也可以與invoke搭配,來完成隨機顯示的功能,詳見Help:隨機顯示

time[編輯 | 編輯原始碼]

time是一個時間日期格式化函數,它的語法為:

{{#time:格式參數}}

或者

{{#time:格式參數|時間參數}}

如果時間參數未指定,則使用該條目被轉換為HTML的時間(值)。注意到由於緩存的緣故,這與條目被瀏覽的時間可能會有高達1星期的偏差。因此可能需要手工更新,方法是加上action=purge參數訪問頁面。

格式參數是一種格式字符,與在PHP的date中的用法相似。

下列格式代碼與在PHP中的意義一樣。所不同的是:如果時間未被指定,則顯示文章最後一次被轉換成HTML的時間。由於緩存的關係,此時間和你瀏覽文章的時間可能有最長一個星期的差別。所以有時可能需要人工更新數據,方法是編輯文章但不做任何修改即保存。

以下格式代碼和PHP中date()函數意義相同。除了國際化(主要是語言)造成的差別以外,所有和PHP的不同點都應當作為軟件的錯誤進行報告。其中所有的數字輸出都會被替換成當地語言的時間格式,可以使用xn(見下文)恢復成顯示原來的數字。

代碼 描述 輸出(示例)
d 一個月中的第 n 天,不足兩位補充0 04
D 星期的縮寫,通常不國際化
j 一個月中的第 n 天,不足兩位不補0 3
l 星期的全稱,通常不國際化 星期五
F 月份的的全稱,通常需要國際化 11月
m 數字表示的月份,不足兩位補充0 01-12
M 月份的的縮寫,通常需要國際化 11月
n 數字表示的月份,不足兩位不補0 1-12
Y 四位年份 2019
y 二位年份 19
H 小時,不足兩位補充0 00-23
i 分鐘,不足兩位補充0 00-59
s 秒,不足兩位補充0 00-59

以下代碼是對PHP作出的擴展:

代碼 描述
xn 將接下來的數字代碼恢復成ASCII中的阿拉伯數字例如,在印地語中,{{#time:H, xnH}}輸出「०६, 06」。
xr 將接下來的數字代碼顯示成羅馬數字。
xg 輸出月份名字的屬格,只針對那些區分主格和屬格的語言。
xx 輸出「x」。

任何其他字符都將不做處理直接輸出。你也可以用引號來輸出未經處理的字符串。

  • 引號中的字符直接輸出(但不輸出引號),沒有配對的引號也直接輸出。例如:
    • {{#time:"現在是"F}} → 現在是11月
    • {{#time:i's"}} → 20'09"
  • 像PHP的date()函數一樣的反斜槓轉義也是支持的。\H直接輸出H\"直接輸出"

未來可能會增加更多格式代碼,可能是完善PHP中已有功能,也可能是增加新功能。

時間參數的格式參照PHP的strtotime()函數。它同時支持相對時間,如"+10 hours",用來表示時區轉換。更多信息參見the GNU tar manual[失效連結]

下表以國際協調時間(UTC)2019年11月22日(星期五)12時20分09秒(北京時間2019年11月22日(星期五)20時20分09秒)為例說明各格式參數的作用。

格式參數 說明 顯示結果
A 顯示AM或PM PM
a 顯示am或pm pm
c 顯示長日期 2019-11-22T12:20:09+00:00
D 星期數,以一個漢字顯示
d 日期日數,有0補齊 22
FM 月份 11月
Gg 當前UTC時間小時數,1位或2位數字 12
Hh 小時數,2位數字 12
i 分鐘數,2位數字 20
j 日數,2位數字 22
L 日期星期數,1位數字,星期日為1,星期六為7 0
l 日期星期數,3位漢字 星期五
m 月份數,2位數字 11
N 星期數,星期一為1,星期日為7 5
n 月份數,1位或2位數字 11
r 英文長日期格式 Fri, 22 Nov 2019 12:20:09 +0000
s 秒數 09
t 該月天數 30
U 時間序號,1970-1-1 0:0:1為1,參見UNIX時間 1574425209
W 日期周數,顯示日期為當年第幾周 47
w 星期數,星期日為0,星期六為6 5
Y 日期年份,4位數字 2019
y 日期年份,2位數字 19
z 顯示日期為當年第幾日 325

系統默認的時間參數為當前UTC+0時間,可以使用{{#time:參數|+8 hours}}得到當前北京時間(UTC+8時間)。

時間參數可以使用絕對時間,如「2008-12-31 23:59:59」,也可以使用相對時間,如「+7 days」或者「-5 hours」得到默認時間7日之後或默認時間5小時之前的時間。也可以二者混合使用,比如{{#time:Y-m-d H:i:s|2001-2-3 04:05:06 +1 year +2 months +3 days +4 hours +5 minutes +6 seconds}}返回「2002-04-06 08:10:12」。

使用xr可以在其後顯示羅馬數字,如{{#time:xrY年xrm月xrd日|2008-12-31}}顯示為「MMVIII年XII月XXXI日」。

產生與簽名格式相同的時間語法為:{{#time:Y年n月j日 (D) H:i (\U\TC)}},顯示為「2019年11月22日 (五) 12:20 (UTC)」(亦可將UTC直接放在time外面,如{{#time:Y年n月j日 (D) H:i}} (UTC))。

language[編輯 | 編輯原始碼]

#language得到指定語言代碼的該語言名稱(以當地語言表示)。

  • {{#language:de}} → Deutsch
  • {{#language:en}} → English
  • {{#language:ja}} → 日本語
  • {{#language:nl}} → Nederlands
  • {{#language:zh}} → 中文
  • {{#language:zh-cn}} → 中文(中国大陆)‎
  • {{#language:zh-tw}} → 中文(台灣)‎
  • {{#language:zh-hk}} → 中文(香港)‎
  • {{#language:zh-sg}} → 中文(新加坡)‎

babel[編輯 | 編輯原始碼]

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

替換為{{babel}}模板,見Extension:Babel

invoke[編輯 | 編輯原始碼]

  • {{#invoke:module|function|arg1|arg2|...}}

調用位於Scribunto中的模塊,見維基百科:Lua

subst[編輯 | 編輯原始碼]

應用subst:到解析器函數,必須在subst:和#之間不能有空格,才可以正常工作。

表格[編輯 | 編輯原始碼]

解析器函數中由於使用了|管道符做參數分隔符,所以不能包括表格所需要的|符。要想在輸出中包含表格,可以通過以下兩個辦法達到:

  1. 通過嵌套模板來達到隱藏|的目的。比如:{{!}}
  2. 使用HTML語法。