ヘルプ:条件文

提供:あわ自由帳

メインページ > ヘルプ:目次  > 条件文

この文書は、テンプレート等における条件文を定義している MediaWiki の ParserFunctions 拡張機能を説明する文書です。条件文はすべて次のような文法を持っています。

{{#関数名: 引数 1 | 引数 2 | 引数 3...}}

なお、ParserFunctions 拡張機能以外の関数は「Help:マジックワード」の方に記載されていますので、あわせて参照してください。

各関数

このモジュールには現在、expr, if, ifeq, ifexist, ifexpr, switch, time, rel2abs, titleparts, iferror の 10 の関数が定義されています。

文法の説明は、

{{#expr: <数式> }}

と書き、<> 内にはそこに書くべき内容を記しています。

使用例として

{{#expr: 1 + 2 }} = 3 (1 + 2 = 3)

と書き、使用例 = 出力 (理由)と記しています。

expr

expr 関数は、数式の演算を行います。文法は、

{{#expr: <数式> }}

サポートしている演算子の優先順位は、

演算子 演算
( ) 優先 {{#expr: (30 + 7) * 7 }} = 259
+ 正符号 {{#expr: 30 * +7 }} = 210
- 負符号 {{#expr: 30 * -7 }} = -210
not 論理否定 {{#expr: not 0 * 7 }} = 7
{{#expr: not 30 * 7 }} = 0
* 乗算 {{#expr: 30 * 7}} = 210
/ 除算(div と全く同じ) {{#expr: 30 / 7}} = 4.2857142857143
div 除算(/ と全く同じ) {{#expr: 30 div 7}} = 4.2857142857143
mod 剰余 {{#expr: 30 mod 7}} = 2
+ 加算 {{#expr: 30 + 7}} = 37
- 減算 {{#expr: 30 - 7}} = 23
round 四捨五入
round の右に小数点以下の桁数を入れる
{{#expr: 30 / 7 round 7}} = 4.2857143
= 等号、左右は等しい {{#expr: 30 = 7}} = 0
<> 不等号、左右は等しくない {{#expr: 30 <> 7}} = 1
!= 不等号、左右は等しくない、排他的論理和 {{#expr: 30 != 7}} = 1
< 小なり、左は右より小さい {{#expr: 30 < 7}} = 0
> 大なり、左は右より大きい {{#expr: 30 > 7}} = 1
<= 左は右以下 {{#expr: 30 <= 7}} = 0
>= 左は右以上 {{#expr: 30 >= 7}} = 1
and 論理積 {{#expr: 30 and 7}} = 1
or 論理和 {{#expr: 30 or 7}} = 1
trunc 小数点以下切り捨て {{#expr: trunc1.5}} = 1
{{#expr: trunc-1.2}} = -1
floor 床。引数より小さい最大の整数 {{#expr: floor 1.2}} = 1
{{#expr: floor -1.2}} = -2
ceil 天井。引数より大きい最少の整数 {{#expr: ceil 1.2}} = 2
{{#expr: ceil -1.2}} = -1

真偽を求める演算子は、偽の時に 0 を、真の時に 1 を返します。

数は十進法で、小数点は "." で表します。E を用いた指数表記も使えます。内部の実装は IEEE 754 の倍精度小数です。

使用例として、 {{#expr: (100 - 32) / 9 * 5 round 0 }} = 38 これは、華氏温度を摂氏温度に変換し、整数に四捨五入します。

if

if は、「もし ... ならば ... さもなくば ...」の構文です。文法は、

{{#if: <もし文> | <ならば文> | <さもなくば文> }}
{{#if: <もし文> | <ならば文> }}

<もし文> が、空文字列ではなくホワイトスペースのみでもない場合は、<ならば文> が返されます。<もし文> が空文字列もしくはホワイトスペースのみであったならば、<さもなくば文> が返されます。<さもなくば文> は省略できます。省略された場合には、<さもなくば文> の代わりに空文字列が返されます。

テンプレートの引数が定義されている場合とされていない場合で処理を分けることができます。例えば、引数が定義されていればそれを、されていなければ 0 を返したい場合は、

{{#if: {{{引数|}}} | {{{引数}}} | 0 }}

とすれば、テンプレート呼び出しの際に、

{{テンプレート|引数=なにがし}}

とあれば「なにがし」を返し、

{{テンプレート}}

または

{{テンプレート|引数=}}

とあれば 0 を返します。 定義されていない場合に、何も返さない(空文字列を返す)としたければ、

{{#if: {{{引数|}}} | {{{引数}}} }}

とします。定義されている場合に 1、そうでない場合に 0 を返したければ、

{{#if: {{{引数|}}} | 1 | 0 }}

とします。 なお、上記の {{{引数|}}} 内の "|" は、引数が指定されていないときのデフォルト値指定を示す記号です。ここでは "|" の後に何も指定されていないため、"引数" が定義されていない場合には空文字列を返し、"引数" が定義されている場合はその値を返します。そのため、#if: {{{引数|}}} という構文を、"引数" が定義されているか否かの判定に用いることができるのです。これを利用すると、

{{#if: {{{引数A|{{{引数B|}}}}}} | 1 | 0 }}

という複雑な判定文を作ることができます。この意味は、「"引数A" か "引数B" のいずれかが定義されていれば 1 を、どちらも定義されていなければ 0 を返す」になります。

ifでは、等号その他の数学的な演算は一切サポートされていないことに注意してください。例えば、

{{#if: 1 = 2 |はい|いいえ}} = はい (1 = 2 は空文字列でないから)

となります。if文は「もし定義されていたら」という条件が意図されています。もし、文字列を比較するのならば、ifeq を使ってください。また、数を比較するのなら、 ifexpr を使ってください。

ifeq

ifeq は2つの文字列を比較し、比較の結果に応じて異なる文字列を返します。文法は、

{{#ifeq: <文字列1> | <文字列2> | <等しいときに返す文> | <等しくないときに返す文> }}

数字と見なされる文字列は、数に変換して判断されます。

  • {{#ifeq: 007 | 7 | 同じ | 違う }} = 同じ
  • {{#ifeq: +007 | 7 | 同じ | 違う }} = 同じ

ダブルクオーテーション (") で囲まれると、数に変換されません。

  • {{#ifeq: "007" | "7" | 同じ | 違う }} = 違う
  • {{#ifeq: "+007" | "7" | 同じ | 違う }} = 違う

大文字と小文字は区別されます。

  • {{#ifeq: A | a | 同じ | 違う }} = 違う

ifexist

ifexist は、指定されたページが存在するかどうかによって、2つのうちの1つの結果を返します。

{{#ifexist: < ページ名> | <あるときに返す文> | <ないときに返す文> }}

1つ目のパラメータは、調べたいページ名です。2つ目は存在している場合に返す文、3つ目は存在しない場合に返す文です。調べたいページ名が有効なタイトルでなければ、存在しない場合の文が返されます。例えば、

  • {{#ifexist:Foo|Bar|RFC 3092}} = RFC 3092 (Foo は存在しないので)
  • {{#ifexist:Help:条件文|はい|いいえ}} = はい (Help:条件文は存在するので)
  • {{#ifexist:m:Help:Calculation|はい|おっと}} = おっと (m:Help:Calculationは存在しますが、これはウィキペディア日本語版の外(メタウィキメディア)のページです)

となります。

{{Exists}}テンプレートは、ウィキメディア日本語版の外にあるページでもWikipedia:ウィキメディア・プロジェクト内であれば「存在する」文を返すこと以外は、同じ結果を返します。言語間リンクとそれ以外を区別するには {{If interwiki link}}も使えます。

ifexpr

ifexpr は、数式を評価(計算)し、その結果に従って2つの文字列からひとつを返します。

{{#ifexpr: <数式> | <0以外の場合に返す文> | <0の場合に返す文> }}

数式の結果が 0 であった場合には <0の場合に返す文> が返され、そのほかの場合には <0以外の場合に返す文> が返されます。数式の文法は expr と同じです。

計算結果が空文字列の場合は、<0以外の場合に返す文> が返されます。

  • {{#ifexpr: {{ns:0}} | Toast | or else }} = or else{{ns:0}} は空文字列だから)

計算が行えない場合や不正な計算の場合はエラー文字列を返します。

  • {{#ifexpr:1/0|0以外|0である}} = 0 で除算しました。
  • {{#ifexpr:1/n|0以外|0である}} = 構文エラー:「n」を認識できません。

<0以外の場合に返す文>も<0の場合に返す文>も省略すると、何も返しません(空文字列を返します。)

  • {{#ifexpr:1/2}} =

省略した場合でも数式の評価は行います。

  • {{#ifexpr:1/0}} = 0 で除算しました。
  • {{#ifexpr:1/n}} = 構文エラー:「n」を認識できません。

評価結果を更に評価させる場合は結果に注意してください。

  • {{#if: {{#ifexpr:1/0}} | エラー文字列 | 空 }} = エラー文字列
  • {{#if: {{#ifexpr:1/n}} | エラー文字列 | 空 }} = エラー文字列
  • {{#if: {{#ifexpr:1E4}} | エラー文字列 | 空 }} = 空
  • {{#if: {{#ifexpr:a=b}} | エラー文字列 | 空 }} = エラー文字列
  • {{#if: {{#ifexpr:1=2}} | エラー文字列 | 空 }} = 空

switch

switch は、ひとつの値(基準値)を他の複数の値と比較し、一致するものが見つかったら該当の値を返します。文法は基本的に、

{{#switch: <基準値>
| <値1> = <返す文1>
| <値2> = <返す文2>
| ...
| <値n> = <返す文n>
| <その他の時に返す文>
}}

switch はそれぞれの値を、基準値と一致するものがみつかるまでそれぞれの値をずっと探そうとします。もし見つかったら、値に相当する文(等号のあとにある文)を返します。もし見つからなかったら、最後の等号のない項を返します。もし、この項にどうしても等号を含めて書く必要がある場合には、#default を用います。

{{#switch: <基準値>
| <値> = <返す文>
| #default = <その他の時に返す文>
}}

同じ返す文を何度も書くのを省略するため、値が「通り抜ける」構造になっていることに気をつけてください。たとえば、

{{#switch: <基準値>
| <値1>
| <値2>
| <値3> = <返す文3>
| ...
| <値n> = <返す文n>
| <その他の時に返す文>
}}

この例では、値1と値2に等号が付いていません。もしそれらに一致したら、返す文3が返されます。つまり、等号を省略した場合には、次の最初の等号の後の文が返されるのです。

switchifeq と同様、数字と見なされる文字列は数として判断されます。次の結果に注意してください。

  • {{#switch: 007 | 7=7にマッチ | 007=007にマッチ }} = 7にマッチ
  • {{#switch: "007" | 7=7にマッチ | 007=007にマッチ }} =
  • {{#switch: "007" | 7=7にマッチ | "007"=007にマッチ }} = 007にマッチ

大文字小文字を無視するためには、基準値と値に必要に応じて {{#lc:}} または {{#uc:}} を使い、小文字または大文字にそろえます。

  • {{#switch: A | a=小文字 | A=大文字 }} = 大文字
  • {{#switch: A | a=小文字 | 大文字 }} = 大文字
  • {{#switch: a | a=小文字 | 大文字 }} = 小文字
  • {{#switch: {{uc:a}} | a=小文字 | 大文字 }} = 大文字
  • {{#switch: {{lc:A}} | a=小文字 | 大文字 }} = 小文字

time

time は、日付や時間の書式を指定して出力する関数です。1970年1月1日00時00分01秒から2038年1月19日03時14分07秒までの時刻に限り、計算ができます。 文法は

{{#time: <書式> }}
{{#time: <書式> | <日付/時間> }}

のどちらかです。

<日付/時間>が指定されていない場合には、コードがHTMLに変換された時刻(UTC)が用いられます。ページのキャッシュに注意してください。記事が閲覧される時刻と1週間以上の時差が出る場合もあるでしょう。最新にするには、その都度更新する必要があるかもしれません。なにも変更しないで投稿し直す(いわゆるゼロ編集)、action=purge をURLのオプションに付ける、閲覧者のオプションで「ページをキャッシュしない」にする、などで更新できます。

以下の <書式> の指定文字は、PHPの指定文字( date())と同じ意味を持っています。国際化(言語と地域による異なった出力)を別にすれば、PHPの動作との重要な相違点は、エラーの考え方と出力です。すべての書式の指定文字は言語に従って文字列を返します。もし、そうしたくないときには、指定文字 xn を前に付けてください。

コード 説明 出力(例) 現在の出力
Y 4桁の西暦年。 2006 2024
y 2桁の西暦年 00 から 99 24
L 閏年かどうかの判定。 閏年なら 1 、そうでなければ 0 1
n 月の数字。ひと桁の時も0が前に付かない。 1 から 12 4
m 月の数字。ひと桁の時は0が前に付く。 01 から 12 04
M 月の短縮形。たいていは国際化されている。 1月 から 12月 4月
F 月。たいていは国際化されている。 1月 から 12月 4月
t 月の日数。 28 から 31 30
W ISO 8601形式の週数。ひと桁の時は0が前に付く。 01 から 53 16
j 日。ひと桁の時も0が前に付かない。 1 から 31 21
d 日。ひと桁の時は0が前に付く。 01 から 31 21
z 0から数えたその年の通算日数。 0 から 365 111
D 曜日の短縮形。まれに国際化されている。 月 から 日
l 曜日。まれに国際化されている。 月曜日 から 日曜日 日曜日
w 曜日の数値(アメリカ式)。 0(日曜日) から 6(土曜日) 0
N ISO 8601形式の曜日の数値。 1(月曜日) から 7(日曜日) 7
a 午前、午後を am/pm で。 am または pm am
A 午前、午後を AM/PM で。 AM または PM AM
g 12時間制の時刻。ひと桁の時は0が前に付かない。 1 から 12 10
h 12時間制の時刻。ひと桁の時は0が前に付く。 01 から 12 10
G 24時間制の時刻。ひと桁の時は0が前に付かない。 0 から 23 10
H 24時間制の時刻。ひと桁の時は0が前に付く。 00 から 23 10
i 分。ひと桁の時は0が前に付く。 00 から 59 17
s 秒。ひと桁の時は0が前に付く。 00 から 59 06
U 1970年1月1日 00:00:00 (GMT) からの秒数 1713694626
c ISO 8601形式の日付。 2024-04-21T10:17:06+00:00
r RFC 2822形式の日付。 Sun, 21 Apr 2024 10:17:06 +0000

以下の <書式> の指定文字は、PHPの文法にはない拡張された文字です。

コード 説明
xn 数字を返すコードの前に置いて、それがASCII数字となるようにする。例えば、ヒンディー語環境において、{{#time:H, xnH | 06:30}} は ०६, 06を返す。
xN これが書かれてより後のコードが半角数字となるようにする。 xn と似ているが、こちらは行の最後まで、もしくはもう一度 xN が現れるまでの全てのコードに作用する。
xr 数字を返すコードの前に置いて、それがローマ数字となるようにする。3000まで対応。{{#time:xrH | 06:30}} は VI を返す。
xg 月の名前を返すコードの前に置いて、主格と所有格に違いのある言語においては、それが所有格となるようにする。
xx 文字の「x」そのもの。

上記以外の文字は、そのまま出力されます。また、上記の文字をそのまま文字として出力する2つの方法があります。

  1. ダブルクオート ( " ) に囲まれた文字は、そのまま出力されます。このとき、ダブルクオートそのものは出力されません。ダブルクオートが奇数の時、最後のダブルクオートはそのまま出力されます。
    1. {{#time: Fには雪が"1m積もった。" |2006-02-12}} = 2月には雪が1m積もった。
    2. {{#time:i's" |0:20:11}} = 20'11"
  2. PHPのdate()同様、エスケープ文字 "\"(円コード、バックスラッシュともいいます)は次の文字をエスケープします。\H は文字 H を出力し、\" は文字 " を出力し、\\ は文字 \ を出力します。
    1. {{#time: "The month is" F}} = The month is 4月
    2. {{#time:i's"}} = 17'06"
    3. {{#time:\\123}} = \123

この関数の利用者からの希望により、<書式> の指定文字は今後追加される可能性があります。PHP の書式の指定文字のより完全な実装と、拡張された x コードの両方です。

引数 日時/時間 は、PHPの strtotime() で使われている文字列と全く同じです。それは December 112006-12-11 のような絶対的な日付や時刻と、時差やタイムゾーンの計算に便利な +10 hours (本当は +1000 という書き方ができるはずですが、2006年9月8日現在、プラスとマイナスが逆になってしまいます)のような相対的な日数、時間の両方をサポートしています。より詳しくはthe GNU tar manualをご覧ください。

  • {{#time:Y年Fj日|-14 days}} = 2024年4月7日(14日前)
  • {{#time:H:i|+9 hours}} = 19:17 (日本時間)
  • {{#time:H:i|8:15 +6 hours}} = 14:15 (6時間後)

rel2abs

rel2abs は、ページ名の相対パスを絶対パスに変換します。

{{#rel2abs: パス }}
{{#rel2abs: パス | 基準パス }}

相対パスは、/./../ のいずれかで始まるか、/..//. のいずれかを含んでいるか、... だけであるかのどれかです。基準パスが与える場合には、絶対パスで与えなければなりません。

例:

  • Help:Foo/bar を基準に、{{#rel2abs: ../baz }} とすると、Help:Foo/baz が返されます。
  • Help:Foo を基準に、 {{#rel2abs: ../baz }} とすると、baz が返されます。
  • Help:Foo を基準に、 {{#rel2abs: ../../baz }} とすると、Error: Invalid depth in path: "Help:Foo/../../baz" (tried to access a node above the root node)" となります。
  • {{#rel2abs: ../baz | Help:Bar/foo }} とすると、Help:Bar/baz が返されます。
  • {{#rel2abs: Help:Foo/bar/../baz }} とすると、Help:Foo/baz が返されます。

そのパスが実際に存在するかどうかは確認しません。そのためには {{ #ifexist }} と併用してください。

例:

{{#ifexist: {{#rel2abs: .. }} | '..' が存在します。 | '..' は存在しません。}}

titleparts

titleparts は、サブページを持つページ名の表示を制御します。

{{#titleparts: <ページ名> | <セグメント数> | <開始点> }}

<開始点>で指定した階層から<セグメント数>の深さの階層までページ名を表示します。<開始点>が指定されていなければ、1 とみなされます。

セグメント数だけ指定した例

  • {{#titleparts:Help:Link/a/b|0|}} = ヘルプ:Link/a/b
  • {{#titleparts:Help:Link/a/b|1|}} = ヘルプ:Link
  • {{#titleparts:Help:Link/a/b|2|}} = ヘルプ:Link/a
  • {{#titleparts:Help:Link/a/b|3|}} = ヘルプ:Link/a/b
  • {{#titleparts:Help:Link/a/b|4|}} = ヘルプ:Link/a/b

開始点も指定した例

  • {{#titleparts:Help:Link/a/b|1|2}} = a
  • {{#titleparts:Help:Link/a/b|2|2}} = a/b
  • {{#titleparts:Help:Link/a/b|1|2}} = b

マイナスを引数にとる例

  • {{#titleparts:Help:Link/a/b|-1|}} = ヘルプ:Link/a
  • {{#titleparts:Help:Link/a/b|1|-1}} = b

iferror

iferror は、条件文などのエラーがあった時に指定した文字列を返す関数です。

{{#iferror:<条件文>|<エラー>|<成功>}} 

とすれば、条件文に<strong class="error">が含まれている時に反応します。この HTML タグは #expr, #ifexpr, #time, #rel2absおよび、いくつかの他のメディアウィキの動作によって出力されます。</ref>。

  • {{#iferror:{{#expr:1+1}}|bad input|valid expression}} = valid expression
  • {{#iferror:{{#expr:1+Z}}|bad input|valid expression}} = bad input

<エラー>と<成功>の指定は任意です。<成功>の引数を指定しなければ、問題がない時には<条件文>が返されます。<エラー>の引数も指定しなければ、エラー時にはなにも返されず、問題がない時にのみ<条件文>が返されます。

  • {{#iferror:{{#expr:1+1}}|bad input}} = 2
  • {{#iferror:{{#expr:1+Z}}|bad input}} = bad input
  • {{#iferror:{{#expr:1+1}}}} = 2
  • {{#iferror:{{#expr:1+Z}}}} =

注意

subst

subst を条件文で用いたい場合には、 subst:# の間に空白を入れないでください。

条件文の中にパイプ構文の表を直接埋め込むことはできません。パイプ構文で用いる | が条件文やテンプレートの引数の区切りと見なされてしまうためです。