Movatterモバイル変換


[0]ホーム

URL:


Jump to content
MediaWiki
Search

Help:Extension:ParserFunctions

From mediawiki.org
This page is atranslated version of the pageHelp:Extension:ParserFunctions and the translation is 100% complete.
Languages:
PD注意: このページを編集すると、編集内容がCC0 のもとで公開されることに同意したと見なされます。詳細はパブリック・ドメインのヘルプ ページを参照してください。PD

ParserFunctions(パーサ関数)拡張機能は MediaWiki に既存の「マジックワード」を補完するパーサ関数を提供します。(文字列処理のために追加のパーサー関数を提供するように設定できるかもしれません。ここでいう文字列関数の説明文書はこちらを参照してください。)この拡張機能が提供するすべてのパーサー関数は以下の形式です:

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

#expr

ここで言及していないほかの複数の演算子を含め、評価器の機能細部に関する詳細なマニュアルについては、Manual:Expr parser function syntax を参照してください。
種類演算子
グループ化 (括弧)( )
数値1234.5  e (2.718)  pi (3.142)
二項演算子e   単項+,-
単項not ceil trunc floor abs exp ln sin cos tan acos asin atan sqrt
二項^
* / div mod fmod
+ -
四捨五入round
論理= != <> > < >= <=
and
or

この関数は、数式を計算してその計算結果を返します。この関数はmw.ext.ParserFunctions.expr 関数を介してScribunto でも使えます。

{{#expr:数式 }}

基本の例

{{#expr: 1 + 1}}2

表の右欄は使用できる演算子で、上ほど優先順位が高いものです。各演算子の機能の詳細は計算のヘルプManual:Expr parser function syntax を参照してください。出力結果の精度と形式には幅があり、ウィキを実行するサーバーのOSバージョン、サイト表示言語の数値形式の影響を受けます。

ブール代数を使用して評価する際、値がゼロならfalse、非ゼロなら正の数でも負の数でも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+}}Expression error: Missing operand for +.
{{#expr: 1 =}}Expression error: Missing operand for =.
{{#expr: 1 foo 2}}Expression error: Unrecognized word "foo".

数値の前後の加算および減算オペランドの順序は意味があり、誤った入力を持つオペランドとしてではなく、正または負の値として扱われる場合があります。

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

メモ: マジックワードの出力を使用する場合は、コンマを削除して数字を翻訳するために、それらをraw形式にする必要があることに注意してください。たとえば、{{NUMBEROFUSERS}} は 18,137,941 になりますが、18137941 が必要です。これは{{formatnum:{{NUMBEROFUSERS}}|R}} を使用して取得できます。これは、数字が翻訳される一部の言語では特に重要です。たとえば、ベンガル語では、{{NUMBEROFUSERS}} は ৩০,০৬১ を生成します。

{{#expr:{{NUMBEROFUSERS}}+100}}Expression error: Unrecognized punctuation character ",".
{{#expr:{{formatnum:{{NUMBEROFUSERS}}|R}}+100}}18138041
警告警告:演算子mod は、第 2 引数の値によっては誤った結果を返す場合があります:
{{#expr: 123 mod (2^64-1)}}Division by zero. (空の文字列を返しますが、123 を返すべきです)
日付に基づいて計算を行う場合(たとえば、現在の日付と時刻が他の日付と時刻より後かどうかをテストする場合)、最初に{{#time: xNU }}を使用して時刻を1970年1月1日(UTC)以降の秒数に変換し、次に単純に加算して日付を数値として減算します。

四捨五入機能

左側の数字を四捨五入して 1/10 の倍数に切り上げ、べき指数は右側に与えられた数の小数点2ケタ目以下を切り上げた値に等しくなります。

切り上げや切り捨てを行うには、それぞれ単項の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この場合も、結果は最後の桁で切り上げられ、追加の切り上げが行われます。 (0.999998… → 1.00000 → 1)
{{#expr: 1234.5678round -2 }}1200負の値は小数点の左側に丸められるため、100に最も近い値に丸められます。
{{#expr: 1234.5678round 2 }}1234.57正の値は小数点の右側に丸められるため、最も近い100番目に丸められます
{{#expr: 1234.5678 round 2.3 }}1234.57round の右の値の小数点以下は、丸めの結果には影響しません
{{#expr:trunc 1234.5678 }}1234小数点以下の切り捨て
最も近い整数への丸め
{{#expr: 1/3round 0 }}0最も近い整数への切り捨てで 0
{{#expr: 1/2round 0 }}1最も近い整数への切り上げで 1
{{#expr: 3/4round 0 }}1最も近い整数への切り上げで 1
{{#expr: -1/3round 0 }}-0最も近い整数への切り上げで 0
{{#expr: -1/2round 0 }}-1最も近い整数への切り捨てで -1
{{#expr: -3/4round 0 }}-1最も近い整数への切り捨てで -1
ceillfloor による切り上げや切り捨て
{{#expr:ceil(1/3) }}1次に大きい整数まで
{{#expr:floor(1/3) }}0次の「小さい」整数、つまりゼロまで
{{#expr:ceil(-1/3) }}-0最も近い整数への切り上げで 0
{{#expr:floor(-1/3) }}-1負の整数である次の小さい整数まで
{{#expr:ceil 1/3 }}0.333333333333331が既に整数であるため、丸めは行なわれません
警告警告:あなたの予想とは異なり、ceil(1/3)ではなく(ceil 1)/3と解釈される
Rounding large numbers
{{#expr: 1e-92 round 400 }}1.0E-92非常に桁の大きな数字を丸めようとすると、無限大に近づきます。 したがって、無限大を備えない元の値を答えとして返します。
{{#expr: 1e108 round 200 }}1.0E+108上記と同じ。

文字列

式は数値のような値でのみ機能し、文字列や文字を比較することはできません。代わりに#ifeqを使用できます。

{{#expr: "a" = "a"}}Expression error: Unrecognized punctuation character """.
{{#expr: a = a}}Expression error: Unrecognized word "a".
{{#ifeq: a| a| 1| 0}}1

#if

この関数はテスト文字列を評価し、それが空であるかどうかを判定します。空白のみを含むテスト文字列は空であると見做されます。

{{#if: テスト文字列| テスト文字列が空ではない場合の値| テスト文字列が空 (または空白のみ) の場合の値}}
{{#if: パラメーター 1| パラメーター 2| パラメーター 3}}

この関数は、初めに最初の引数が空でないか確かめます。最初の引数が空でない場合、2 番目の引数を表示します。最初の引数が空または空白文字(空白、改行等)のみを含む場合、3 番目の引数を表示します。

{{#if:| yes| no}}no
{{#if: string| yes| no}}yes
{{#if:&nbsp;&nbsp;&nbsp;&nbsp;| yes| no}}yes
{{#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レベルのネストが可能です。

{{#if:テスト文字列|テスト文字列が空ではない場合の値|{{#if:テスト文字列|テスト文字列が空ではない場合の値|テスト文字列が空 (または空白のみ) の場合の値}}}}

#if 文において引数をテスト文字列として用いることも可能です。変数名の後には|(パイプ記号)を追加する必要があります。(そのため、パラメーターに値がない場合は、文字列 "{{{1}}}"ではなく空の文字列に評価されます。)

{{#if:{{{1|}}}|変数1にテキストを入力しました|変数1にテキストがありません}}

このパーサー関数の他の例についてはHelp:テンプレート内でのパーサー関数 を参照してください。

#ifeq

このパーサー関数は、2つの入力文字列を比較し、それらが同一であるかどうかを判断し、結果に基づいて2つの文字列のうちの1つを返します。さらに比較と出力文字列が必要な場合は、#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 をパーサーを使用して、短い時間と長い時間の2つの標準時間から選択するとします。文字列「short」と比較する最初の入力としてパラメータを取ります–順序の規則はありませんが、パラメーターが最初にある方が読みやすくなります。テンプレートコードは次のように定義されています:

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

次のようになります:

{{timer|short}}20
{{timer|20}}40
{{timer}}40
警告警告:パーサー関数内で使用する場合、パーサータグおよびその他のパーサー関数は一時的に一意のコードに置き換える必要があります。 これは比較に影響します:
{{#ifeq: <nowiki>foo</nowiki> | <nowiki>foo</nowiki> | equal | not equal}}not equal
{{#ifeq: <math>foo</math> | <math>foo</math> | equal | not equal}}not equal
{{#ifeq: {{#tag:math|foo}} | {{#tag:math|foo}} | equal | not equal}}not equal
{{#ifeq:[[foo]]|[[foo]]| equal| not equal}}equal
比較するどの文字列も、そのタグを含む同じテンプレートを呼び出す場合は真、そのタグを含み内容が同じだが別々のテンプレートを呼び出す場合は偽。
警告警告:PAGENAMEマジックワードとの文字通りの比較は、サイトの構成によっては失敗する場合があります。 たとえば、ウィキによっては、{{FULLPAGENAME}}が最初の文字を大文字にし、すべてのアンダースコアをスペースに置き換える場合があります。

これを回避するには、両方のパラメーターにマジックワードを適用します。

{{#ifeq:{{FULLPAGENAME: L'Aquila}}|{{FULLPAGENAME}}| equal| not equal}}equal

#iferror

この関数は入力文字列を取り、2つの結果から1つを返します。この関数は、#expr#time#rel2abs のような他のパーサー関数、ループや再帰のようなテンプレートエラー、その他の「フェースソフト」なパーサーエラーによって作られたclass="error" を含む HTML オブジェクトが入力文字列に含まれていた場合にtrue と評価します。

{{#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:<strongclass="error">a</strong>| error| correct}}error

エラーによっては追跡カテゴリを生じさせ、{{#iferror:}} を当てても同カテゴリの追加を回避できません。

#ifexpr

この関数は数式を評価し、結果の真偽値に応じて2つの文字列のいずれかを返します:

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

expression 入力は、上記の#exprとまったく同じように評価され、同じ演算子を使用できます。次に、出力は真偽値の式として評価されます。

空の入力式はfalseと評価されます:

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

上記のように、ゼロはfalseと評価され、ゼロ以外の値はtrueと評価されるため、この関数は#ifeq#exprのみを使用する関数と同等です:

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

空の入力式または間違った入力式を除きます(エラーメッセージは空の文字列として扱われます。ゼロに等しくないため、value if true を取得します)。

{{#ifexpr: =| yes| no}}Expression error: Unexpected = operator.

比較

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

等号または不等号のブール演算子に対応します。

{{#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
警告警告:#ifexprによる数値比較の結果は、#ifeq#switchの結果と必ずしも一致しません。 これらの後者の2つは、#ifexprよりも正確であり、同等の結果を返しません。

変更された最後の桁とのこれらの比較を検討してください:

{{#ifeq: 12345678901234567| 12345678901234568| equal| not equal}}not equal
{{#switch: 12345678901234567| 12345678901234568= equal| not equal}}not equal

#ifeq#switchで使用されるPHPは、整数型の2つの数値を比較するため、期待される結果を正しく返します。一方、#ifexprと同じ番号の場合:

{{#ifexpr: 12345678901234567 = 12345678901234568| equal| not equal}}equal

数字が異なると、equalの結果は実際には正しくありません。

#ifexprでのこの動作は、MediaWikiが式のリテラル数をfloat(フロート)型に変換するために発生します。これは、このような大きな整数の場合、丸めを伴います。

#ifexist

Manual:ページの有無を確認を参照すると、特定のページの有無とその他の制限要件が付いているかどうか確認が可能

この関数は入力文字列を受け取り、それをページ名として解釈し、そのページがローカルウィキに存在するかどうかに応じて、2つの値のいずれかを返します。

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

ページが存在する場合、コンテンツが含まれているかどうかにかかわらず、関数はtrue(真)と評価されます(カテゴリリンクやマジックワードなどのメタデータが含まれていますが、表示されていません)。 コンテンツ、空白、またはリダイレクトです。存在していないページのみがfalse(偽)と評価されます。これには、ページが以前は存在していたが削除された場合も含まれます。

{{#ifexist: Help:Extension:ParserFunctions/ja | exists | doesn't exist }}exists
{{#ifexist: XXHelp:Extension:ParserFunctions/jaXX | exists | doesn't exist }}doesn't exist

この関数は、カスタマイズされたシステムメッセージと、ソフトウェアによって定義された特別ページに対してtrue(真)と評価されます。

{{#ifexist: Special:Watchlist | exists | doesn't exist }}exists
{{#ifexist: Special:CheckUser | exists | doesn't exist }}exists (Checkuser拡張機能がこのウィキにインストールされているため)
{{#ifexist: MediaWiki:Copyright | exists | doesn't exist }}doesn't exist (MediaWiki:Copyrightがカスタマイズされていないため)

MediaWiki 1.45 以前は、ページが#ifexist:を使用してターゲットをチェックする場合、そのページはターゲットページのSpecial:WhatLinksHereリストに表示されます。したがって、コード{{#ifexist:Foo }}がこのページ(Help:Extension:ParserFunctions/ja)にライブで含まれている場合、Special:WhatLinksHere/FooはHelp:Extension:ParserFunctions/jaをリストします。

共有メディアリポジトリを使用するWikiでは、#ifexist:を使用して、ファイルがリポジトリにアップロードされているかどうかを確認できますが、Wiki自体にはアップロードされていません。

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

ファイルのローカル説明ページが作成されている場合、結果は上記のすべてに対してexistsになります。

#ifexist:インターウィキリンクでは機能しません。

ifexistの制限

#ifexist: は、「高負荷なパーサー関数」と見なされます。 1つのページに含めることができるのは限られた数だけです(参照読み込みされたテンプレート内の関数を含む)。この制限を超えると、参照読み込み先ページが存在するかどうかに関係なく、それ以降の#ifexist: 関数は自動的にfalseを返し、ページはCategory:Pages with too many expensive parser function calls に分類されます。tracking category の名前は、ウィキのコンテンツ言語によって異なる場合があります。

使用事例によっては、a.new (存在しないページへのリンクを選択) またはa:not(.new) (存在するページへのリンクを選択) を使用して ifexist 効果を css で代用できます。さらに、単一ページで使用するメモリ消耗の激しいパーサ関数の件数の上限は$wgExpensiveParserFunctionLimit で制御され、必要な場合は上限値を LocalSettings.php で変更できます。

存在し、必要なページ

MediaWiki 1.45 まで当該ページは存在せず、#ifexistを使っているかどうかテスト済みのページは、募集ページに分類されました。根拠はT14019 に記述があり、 回避策の詳細はTemplate:Linkless を参照してください。(訳注:リンク元は削除済み)

#rel2abs

この関数は相対ファイル パスを絶対ファイル パスに変換します。

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

path 部分では、以下の構文を使用できます:

  • . → 現在の階層
  • .. → 1 つ上の階層に移動
  • /foo → 下位ディレクトリ /foo に 1 階層移動

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

/././ のような無効な構文は無視されます。連続する終止符は2つまでしか許可されていないため、次のようなシーケンスを使用して、連続するステートメントを区切ることができます。

{{#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」の階層が無効です (ルート階層からのアクセスをお試しください)。

同様の関数のグループについては、ヘルプ:マジックワード#URL データ も参照してください。組み込みパーサー関数には 'localurl:', 'fullurl:', 'anchorencode:' などがあります。

#switch

関連項目:w:Help:Switch parser function

この関数は入力値1件を複数のテストケースと比較し、ヒットした場合は当該の文字列を返します。

{{#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 は、テンプレート コーディングに慣れていない編集者が構成可能な要素を表示および編集できるようにする構成ファイルに影響を与える可能性があります。

既定

case文字列に対応するcomparison stringがヒットしない場合、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

代替方法として、既定の結果を "#default" のcase文字列で明示的に宣言することもできます。

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

この方法で宣言された既定の結果は、関数内のどこにでも配置できます。

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

defaultパラメータが省略され、一致が行われない場合、result(結果)は返されません。

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

ここではケース2と3、4とも出力はresult234です。ケース6と7の出力は両方ともresult67です上記の場合、最後のパラメータの「#default =」は省略できます。

パラメータとともに使用

この関数は、テスト文字列としてパラメータとともに使用できます。この場合、大文字と小文字を文字列 「{{{parameter name}}}」に設定する可能性は非常に低いため、パラメータ名の後にパイプを配置する必要はありません。(これは、パイプが存在せず、パラメーターが存在しないか、値がある場合にパラメーターが既定で設定する値です。Help:テンプレート内でのパーサー関数 を参照してください。)

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

上記の場合、{{{1}}}fooに等しい場合、関数はFooを返します。bazに等しい場合、関数はBazを返します。パラメータが空であるか存在しない場合、関数はBarを返します。

上記のセクションのように、ケースを組み合わせて単一の結果を得ることができます。

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

ここで、{{{1}}}foozoo、またはrooに等しい場合、関数はFooを返します。bazに等しい場合、関数はBazを返します。パラメータが空であるか存在しない場合、関数はBarを返します。

さらに、テストパラメータ値がいずれの場合にも一致しない場合に何も返したくない場合は、既定の結果を省略できます。

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

この場合、{{{1}}}が存在してfooまたはbarに等しい場合を除き、関数は空の文字列を返します。この場合、関数はそれぞれFooまたはBarを返します。

これは、既定の結果を空として宣言するのと同じ効果があります。

{{#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: 02| +1= one| +2= two| three}} →two
{{#switch: 100| 1e1= ten| 1e2= hundred| other}} →hundred
{{#switch: a| a= A| b= B| C}} →A
{{#switch: A| a= A| b= B| C}} →C

case文字列は空白の場合があります。

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

一致が見つかると、それ以降のcasesは無視されます。

{{#switch: b| f= Foo| b= Bar| b= Baz|}}Bar
警告警告:#switchおよび#ifeqを使用した数値比較は、式の比較と同等ではありません(上記も参照)。
{{#switch: 12345678901234567| 12345678901234568= A| B}} →B
{{#ifexpr: 12345678901234567 = 12345678901234568| A| B}} →A

生の等号

"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
この関数を実社会で使う易しい例としてNBATemplate:NBA color (訳注:バスケットボールチームの配色用テンプレート) を参照してください。複雑なサンプルはTemplate:Extension (テンプレート:拡張機能) とw:Template:BOTREQ (訳注:Bot作業依頼のコメント用テンプレート) の2件を参照してください。

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

一方、switchの交換は、両方のブランチにネストされたIF(インデントの代替で示され、両側にインデントされている)の場合、複雑/非実用的であり、完全に対称的なツリーになります。

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

コード説明現在の出力
(更新するにはこのページのキャッシュを破棄してください)
Y4 桁の年2025
y2 桁の年25
L閏年の場合 1、平年の場合 00
o[note 1]指定した週の ISO-8601 年[note 2]2025[note 3]
  1. PHP 5.1.0 以降およびrev:45208 が必要
  2. Y と等値になるが、ISO 週番号 (W) が前月もしくは次月の場合、年で代用。
  3. 注1の場合が未記入だと、リテラルo を出力。
n月番号、ゼロ補完なし7
m月番号、ゼロ補完あり07
Mサイトの言語での月名の省略形7月
Fサイトの言語での完全な月名7月
xg属格主格を区別する表示言語では、月の名前の表記を属格形式で出力。このオプションはスラヴ語派のポーランド語やロシア語、ベラルーシ語やチェコ語、スロバキア語やスロベニア語、ウクライナ語などに使える。ポーランド語の例:
{{#time:F Y|June 2010|pl}} → czerwiec 2010
(主格)
{{#time:d xg Y|20 June 2010|pl}} → 20 czerwca 2010
(所有格)
月または年の通算日
j日、ゼロ補完なし18
d日、ゼロ補完あり18
z日 (1月 1 = 0).
注 注: ISO 日付を得るには 1 を加算する。
198
週および曜日
WISO 8601 週番号、ゼロ補完あり29
NISO 8601 曜日番号 (月曜日 = 1、日曜日 = 7)5
w曜日番号 (日曜日 = 0、土曜日 = 6)5
D曜日の略号。翻訳されない場合が多い。
l曜日の省略しない表記。翻訳されない場合が多い。金曜日
a午前 (00:00:00 ~ 11:59:59) の場合「am」、午後 (12:00:00 ~ 23:59:59) の場合「pm」pm
A上のa の大文字版。PM
g時、12 時間制、ゼロ補完なし8
h時、12 時間制、ゼロ補完あり08
G時、24 時間制、ゼロ補完なし20
H時、24 時間制、ゼロ補完あり20
分と秒
i分、ゼロ補完あり14
s秒、ゼロ補完あり51
UUnix 日時。 1970年1月1日 00:00:00 GMT からの経過秒数1752869691
タイムゾーン (1.22wmf2 時点)
eタイムゾーン識別子UTC
I日時がサマータイムかどうか0
Oグリニッジ標準時 (GMT) との差+0000
Pグリニッジ標準時 (GMT) との差、コロン付き+00:00
Tタイムゾーンの省略形UTC
Zタイムゾーンのオフセット (秒)0
その他
t31
cISO 8601 形式の日付、Y-m-d"T"H:i:s+00:00 と同等。2025-07-18T20:14:51+00:00
rRFC 5322 形式の日時、D, j M Y H:i:s +0000 と同等だが、曜日と月名は国際化されない。Fri, 18 Jul 2025 20:14:51 +0000
グレゴリオ暦以外
イスラム暦
xmj22
xmF完全な月名ムハッラム
xmn月番号1
xmY完全な年1447
イラン暦 (Jalaly)
xit月間の日数31
xiz119
xij27
xiF完全な月名ティール
xin月番号4
xiY完全な年1404
xiy2 桁の年04
ユダヤ暦
xjj22
xjF完全な月名タムーズ
xjt月の日数29
xjx月名の所有格タムーズ
xjn月番号10
xjY完全な年5785
タイ太陽暦
xkYタイ太陽暦の完全な年。
注 注: 1941 年より前の 1 月から 3 月の範囲は、適切には計算できません。
2568
民国紀元/主体暦
xoY完全な年114
日本の年号
xtY完全な年令和7
フラグ
xn後続の数値をそのまま半角英数字に整形する。ヒンディー語では、{{#time:H, xnH}} は ०६, 06 を返す。
xNxn と同様ですが、トグル フラグとして文字列の終端または文字列に次のxN が出現するまで保持されます。
xr後続の数値をローマ数字に整形する。10,000 までの数値で動作する。
(MediaWiki 1.20 以前は上限 3,000)
{{#time:xrY}} → MMXXV
xh後続の数値をヘブライ数字に整形する。{{#time:xhY}} → ב'כ"ה

このパーサ関数は日付あるいは時間 (グレゴリア暦) を取って指定の文法どおりにフォーマットします。日・時間のオブジェクトを特定する方法; 既定値はマジックワード{{CURRENTTIMESTAMP}} – つまりページが最近 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 }}

右の図には利用できる書式コードをまとめてあります。書式文字列内にこれら以外の文字が含まれると、未処理で出力します。空白類も扱いは同様です (コードの解析に不要なため)。書式文字列で文字が認識されず、日付/時刻オブジェクトにエラーがない場合、書式文字列が出力として返されます。また書式文字列内の文字をエスケープする方法が 2 つあります。

  1. バックスラッシュに続けて書式指定文字列を記述すると、ひとまとまりのリテラル文字として解釈
  2. 文字列を二重引用符で囲むと、リテラル文字として扱い引用符を除去。

またさらに、有向グラフxx の場合、ひとまとまりのリテラル文字「x」と解釈します。

書式設定コードのリストは進化し続けているため (新しいカレンダーのサポートや、異なる方法で計算および書式設定された新しい日付フィールドのサポートなど)、変更せずに渡す必要があるすべてのリテラル文字 (書式設定コードで現在使用されている ASCII 文字だけでなく) をエスケープする必要があります。

残念ながら、現時点では、ASCII 一重引用符は、現在サポートされている ASCII 二重引用符(たとえば、JSON、C、C++ での文字列値の区切りなどの他の用途では二重引用符が必須です)とバックスラッシュ(JSON、C、C++、PHP、JavaScript、Lua など多くの言語で使用される文字列定数でもエスケープする必要があります)に代わるリテラル テキストをマークするための単純な代替手段としてはまだ認識されていません。したがって、バックスラッシュでエスケープせずにリテラルの二重引用符を埋め込むことはできません (または、代わりに他の波型、角型、四角型の引用符を使用することもできます)。

{{#time: Y-m-d}}2025-07-18
{{#time:[[Y]] m d}}2025 07 18
{{#time:[[Y (year)]]}}2025 (25UTCpmFri, 18 Jul 2025 20:14:51 +0000)
{{#time:[[Y "(year)"]]}}2025 (year)
{{#time: i's"}}14'51"

PHPはdate/time objectを受け取ると、どの書式でもstrtotime() 関数で処理します (訳注:英文形式の日付を Unix タイムスタンプに変換)。絶対時間 (例:20 December 2000)、相対時間 (例:+20 hours)、および組み合わせ時間 (例:30 July +1 year) が受け入れられます。

{{#time: r|now}}Fri, 18 Jul 2025 20:14:52 +0000
{{#time: r|+2 hours}}Fri, 18 Jul 2025 22:14:52 +0000
{{#time: r|now + 2 hours}}Fri, 18 Jul 2025 22:14:52 +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}}エラー: 日時が無効です。
{{#time: r|last tuesday}}Tue, 15 Jul 2025 00:00:00 +0000

ISO 639-3 (?) の言語コードにより、文字列を選択した言語で表示します。

{{#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パラメーターは、「日付/時刻オブジェクト」がローカルタイムゾーンを参照するかUTCを参照するかを指定します。

これは真偽値のパラメーターです。その値は、引数の値をキャストすることによって決定されます(文字列を真偽値にキャストする方法の詳細については、公式PHPドキュメントを参照してください)。

変数$wgLocaltimezoneUTCに設定されている場合、localtrueまたはfalseに設定されていても、出力に違いはないことに注意してください。

詳細については、次の例を参照してください:

{{#time: Y F d H:i:s|now|it|0}}2025 luglio 18 20:14:52
{{#time: Y F d H:i:s|now|it|1}}2025 luglio 18 20:14:52
{{#time: Y F d H:i:s|+2 hours||0}}2025 7月 18 22:14:52
{{#time: Y F d H:i:s|+2 hours||1}}2025 7月 18 22:14:52
{{#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-16T15:05:43+00:00

Unix タイムスタンプを計算する場合は、文字列の先頭に@ 記号を付けると日付計算に使えます。

{{#time: U| now}}1752869692
{{#time: r | @1752869691 }}Fri, 18 Jul 2025 20:14:51 +0000
警告警告:もしタイムスタンプの数値の先頭に@ を付けないと、ほぼ毎回、エラーか想定外の値を返します。
{{#time: r| 1970-01-01 00:16:39}}Thu, 01 Jan 1970 00:16:39 +0000
{{#time: U| 1970-01-01 00:16:39}}999
{{#time: r | @999 }}Thu, 01 Jan 1970 00:16:39 +0000 (正しい)
{{#time: r | 999 }}エラー: 日時が無効です。 (年の書式が想定外)
{{#time: r| 1970-01-01 00:16:40}}Thu, 01 Jan 1970 00:16:40 +0000
{{#time: U| 1970-01-01 00:16:40}}1000
{{#time: r | @1000 }}Thu, 01 Jan 1970 00:16:40 +0000 (正しい)
{{#time: r | 1000 }}Fri, 18 Jul 1000 00:00:00 +0000 (年を想定、今日の月日を添える)
{{#time: r| 1970-01-01 02:46:39}}Thu, 01 Jan 1970 02:46:39 +0000
{{#time: U| 1970-01-01 02:46:39}}9999
{{#time: r | @9999 }}Thu, 01 Jan 1970 02:46:39 +0000 (正しい)
{{#time: r | 9999 }}Sun, 18 Jul 9999 00:00:00 +0000 (年を想定、今日の月日を添える)
{{#time: r| 1970-01-01 02:46:40}}Thu, 01 Jan 1970 02:46:40 +0000
{{#time: U| 1970-01-01 02:46:40}}10000
{{#time: r | @10000 }}Thu, 01 Jan 1970 02:46:40 +0000 (正しい)
{{#time: r | 10000 }}エラー: 日時が無効です。 (年の書式が想定外)
警告警告:許容できる入力値は「1 January 0111 → 31 December 9999」の範囲です。年は100から110までが不定形です。Y (年) とうるう年はその 100-110 と同様に不定形、r (RFC 5322 形式)、D (曜日略号)、l (曜日)、U (Unix日時) を記述すると年を 2000-2010 の範囲として解釈します。
{{#time: d F Y| 29 Feb 0100}}01 3月 0100
(これはうるう年ではないから出力は正しい)、ただし
{{#time: r| 29 Feb 0100}}Mon, 01 Mar 0100 00:00:00 +0000 (こちらは間違い。100 を2000と解釈できたのに、うるう年だったため。)
{{#time: d F Y| 15 April 10000}}エラー: 日時が無効です。
{{#time: r| 10000-4-15}}Sat, 15 Apr 2000 10:00:00 +0000

先頭に 0 を付けて 4 桁の書式にした場合を除いて、年の値 0-99 は 2000-2069 年および 1970-1999 年と解釈されます:

{{#time: d F Y| 1 Jan 6}}01 1月 2006
{{#time: d F Y| 1 Jan 06}}01 1月 2006
{{#time: d F Y| 1 Jan 006}}01 1月 2006
{{#time: d F Y| 1 Jan 0006}}01 1月 0006 (4-digit format)
日は年が 100-110 の範囲か、1753以上で与えられ、原因は 111-1752 の範囲では r-出力が「不明」、l-出力が「<>」となってしまうからです。結果として、r-出力はこれらの範囲の年の入力値として許容されません。

完全または部分的な絶対日付を指定できます。この関数はcurrent 値を使用して、指定されていない日付の部分を「補完」します。

{{#time: Y| January 1}}2025
警告警告:補完の関数は不定形です。特定の部分は現在の値で補完され、別の部分はエラーになります。
{{#time: Y m d H:i:s| June}}2025 06 18 00:00:00 この例は日のゼロ時ゼロ分、現在の日、数式に記述した月 (June=6月) と年を表示。
{{#time: Y m d H:i:s| 2003}}2003 07 18 00:00:00 この例はゼロ時ゼロ分、現在の月日、数式に記述した年を表示。

満員の日の例外ケースがあります:

{{#time: Y m d H:i:s| June 2003}}2003 06 01 00:00:00 1日の始まりと月の始まりを示します。

4桁の数字は常に年として解釈され、時間や分としては解釈されません。[1]

{{#time: Y m d H:i:s| 1959}}1959 07 18 00:00:00

6桁の数字は時間と解釈、できるかぎり分と秒まで出力しようとしますが、それ以外の場合はエラーになります (たとえば年月日とは解釈しません)。

{{#time: Y m d H:i:s| 195909}}2025 07 18 19:59:09 記述したコードは年とゼロ補完の月と日を要求したのに、出力は時間として解釈。
{{#time: Y m d H:i:s| 196009}}エラー: 日時が無効です。 19:60:09 は有効な時刻ではないにもかかわらず、196009 は1960年9月とは解釈されません。

関数は日付計算をこなそうとします。(訳注:Fは「サイトの言語での完全な月名」、dはゼロ補完の日を求め、入力値の不備で出力結果が不定形。)

{{#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}}2025-6月

#timeに対する書式文字列の総文字数(すべての呼び出しでの総和)は半角6000文字に制限されています[2]

タイムゾーンの問題点

この#timeパーサ関数(より具体的にはPHP DateTime )には相対的なタイムゾーンオフセットとして整数以外 は渡せないというバグがあります。EDT (東部夏時間) など時間通りのタイムゾーンを使用する場合、この問題は発生しません。例をあげます。:

  • {{#time:g:i A| -4 hours}} → 4:14 PM

ところがインドは UTC (協定世界時) との時差が +5.5 時間のため、タイムゾーンを適用すると通常なら正しいオフセットの計算に失敗するはずです。実例はこちら:

  • {{#time:g:i A| +5.5 hours}} → 8:14 PM

そこで回避策として、単純に時間を分か秒 (minutes か seconds) に換算して、次の例のように与えます。

  • {{#time:g:i A| +330 minutes}} → 1:44 AM
  • {{#time:g:i A| +19800 seconds}} → 1:44 AM

(関数の開発者 Tim Starling がこれを解決する構文を書いてくれました。)

署名などの#time書式

時にはタイムスタンプを構築すると便利で、見た目はトークページの議論で署名機能が自動生成するタイムスタンプそっくりです。英語版ウィキ類の場合は、以下の方法で生成します。

  • {{#timel:H:i, j xg Y (e)|+330 minutes}} → 01:44, 19 7月 2025 (UTC)

#timel

この関数は構文のショートカットでlocal パラメータにtrue を設定すると挙動は{{#time: ... }} と同一、常に利用者が設定した標準時またはウィキが設定した時間帯を使用 (タイムゾーンの設定は$wgLocaltimezone に従う)

関数の構文は次のとおりです:

{{#timel:format string }}
{{#timel:format string |date/time object }}
{{#timel:format string |date/time object |language code }}
変数$wgLocaltimezoneUTCに設定されている場合、localtrueまたはfalseに設定されていても、出力に違いはないことに注意してください。
タイムゾーンがUTCではないサーバーからの#timeおよび#timelパーサー関数の使用例

例えば、以下の例を参照してください:

{{#time:c|now|it}}2025-07-18T20:14:52+00:00
{{#time:c|now|it|0}}2025-07-18T20:14:52+00:00
{{#time:c|now|it|1}}2025-07-18T20:14:52+00:00
{{#timel:c|now|it}}2025-07-18T20:14:52+00:00
https://no.wikipedia.org/wiki/Maldiskusjon:Sommertidからの警告例
警告警告:UTC(旧称GMT)とは異なるタイムゾーンのウィキペディアでは、1970-01-01 00:00:00 UTC以降、時間と時間の両方のUが同じ秒数を返すことに注意してください。
U Unix時間。 1970年1月1日00:00:00 GMTからの秒数。
Z タイムゾーンのオフセット (秒)
{{#time: U}}1752869691
{{#timel: U}}1752869691
{{#time: Z}}0
{{#timel: Z}}0

#timef

この関数は選択した言語の標準の書式を日付に与え、$dateFormats で定義した通りです(詳細はT223772を参照)。

{{#timef:日時オブジェクト }}
{{#timef:日時オブジェクト |書式の種別 }}
{{#timef:日時オブジェクト |書式の種別 |言語コード }}

date/time object の書式は#timeの場合と同じです。空欄の場合、ページをレンダリングした時点を採用します。

書式の種別は以下のいずれかの場合があります。

time
時間のみ表示。
date
日付のみ表示。
both
日付と時間の両方を表示。
pretty
年を省いた略式の日付のみ表示。 これはすべての言語に対応していませんので、非対応の場合は 「date」書式を採用。

書式の種別format type を指定しない場合はまるでboth を指定したように、時間と日付を表示します。

もしも「言語コード」を指定しない場合は、そのページの内容の言語を採用。

言語単位で日付の書式が異なることから、#time の代わりに#timef を用いて、多言語への対応を簡素にしてあります。

英語では月日の順序を$wgAmericanDatesで調節します。

例:

{{#timef:now|both|en}} 20:14, 18 July 2025
{{#timef:now|both|ja}} 2025年7月18日 (金) 20:14
{{#timef:now|pretty|en}} 18 July
{{#timef:now|pretty|pl}} 18 lipca
{{#timef:|time}} 20:14

#timefl

この関数は#timef と同等ですが、$wgLocaltimezoneに設定したその地域の標準時を採用します。

{{#timefl:date/time object }}
{{#timefl:date/time object |format type }}
{{#timefl:date/time object |format type |language code }}

#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 {{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 | 3 }}baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | 3 | 2 }}bar/baz/quok
{{#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 文字列の末尾から1つのセグメントを削除してから、2番目以降のセグメントを返します
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | -2 }} baz 最後から2番目の要素からコピーを開始します。文字列の末尾から1つのセグメントを削除します

処理する前に、「pagename」パラメータはHTMLでデコードされます。標準のHTML文字エンティティが含まれている場合、それらはプレーン文字に変換されます(UTF-8で内部的にエンコードされます。つまり、MediaWikiソースページで使用するのと同じエンコードです。このパーサー関数)。

たとえば、pagename&quot;&#34;、または&#x22;が含まれている場合は、"に置き換えられます。
HTMLからプレーンテキストへの他の変換は実行されないため、HTMLタグは、ページ名で無効であっても、この最初のステップではそのまま残ります。
MediaWiki の一部のマジックキーワードやパーサー関数 ({{PAGENAME}} など) は、入力パラメータが HTML エンコードされていない場合でも、不必要に HTML エンコードされた文字列を返すことが知られています。

titleparts パーサー関数を回避策として使用して、これらの返された文字列を変換できます。これにより、パラメータにページ名を受け取るがHTMLエンコードされた入力文字列では依然として正しく動作しない他のパーサー関数 ({{PAGESINCAT:}} など) によっても正しく処理できるようになります。

たとえば、現在のページがCategory:Côte-d'Or の場合、次のようになります。

  • {{#ifeq: {{FULLPAGENAME}} | Category:Côte-d'Or | 1 | 0 }}{{#ifeq: {{FULLPAGENAME}} | Category:Côte-d&apos;Or | 1 | 0 }} は両方とも1 を返します (#ifeq パーサー関数は入力パラメータの HTML デコードを実行します)。
  • {{#switch: {{FULLPAGENAME}} | Category:Côte-d'Or = 1 | #default = 0 }}{{#switch: {{FULLPAGENAME}} | Category:Côte-d&apos;Or = 1 | #default = 0 }} は両方とも1 を返します (#switch パーサー関数は入力パラメータの HTML デコードを実行します)。
  • $code 0、$code 1、または{{#ifexist: Category:Côte-d&apos;Or | 1 | 0 }} はすべて、そのカテゴリ ページが存在する場合は1 を返します (#ifexist パーサー関数は入力パラメータの HTML デコードを実行します)。
  • カテゴリにページまたはサブカテゴリが含まれている場合、{{PAGESINCAT: Côte-d'Or }} はゼロ以外の数値を返します、:
  • {{PAGESINCAT: {{CURRENTPAGENAME}} }} は、次のように無条件に 0 を返す場合があります:
  • {{PAGESINCAT: {{PAGENAME:Category:Côte-d'Or}} }}
  • {{PAGESINCAT: {{PAGENAME:Category:Côte-d&apos;Or}} }}

この予期しない動作の理由は、MediaWiki の現在のバージョンには 2 つの注意事項があるためです。

  • {{FULLPAGENAME}}、または{{FULLPAGENAME:Côte-d'Or}} は、期待されるCategory:Côte-d'Or ではなく、実際に HTML エンコードされた文字列Category:Côte-d&apos;Or を返す場合があります。
  • {{PAGESINCAT: Côte-d&apos;Or }}無条件に 0 を返します (PAGESINCAT マジック キーワードは入力パラメータの HTML デコードを実行しません)。

titleparts を使用した簡単な解決策 (両方の注意点が MediaWiki の新しいバージョンで修正されれば引き続き機能します) は次のとおりです。

  • {{PAGESINCAT: {{#titleparts: {{CURRENTPAGENAME}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME:Category:Côte-d'Or}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME:Category:Côte-d&apos;Or}} }} }}、これらはすべて同じカテゴリ内の実際のページ数を返します。

次に、デコードされたページ名は、可能な限り 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
#titleparts を小さな「文字列パーサーおよびコンバーター」として使用できますが、大文字の最初の部分文字列を返すことに注意してください。
{{#titleparts:one/two/three/four|1|1 }}One
{{#titleparts: one/two/three/four|1|2 }}two

小文字を求めるには lc: 関数を使い出力をコントロールします。

{{lc: {{#titleparts:one/two/three/four|1|1 }} }}one

文字列の先頭に「ダミー」のスラッシュを追加して、最初の部分文字列の大文字化 (大文字または小文字) を正しく行うことができます。返される最初のセグメント には、1 ではなく2 を使用します。

{{#titleparts:/one/two/three/four|1|2 }}one
{{#titleparts:/One/two/three/four|1|2 }}One
警告警告:ページ名に使用すると法律違反となる特定の文字があると、#titleparts はその文字列を解析できない例は次のとおり:
{{#titleparts: {one/two} | 1 | 1 }}{one/two}. 以下の値にはなりません:{one
{{#titleparts: [[page]]/123 | 1 | 2 }}page/123. ページ名では括弧は無効であり、このパーサー関数は、MediaWiki 構文やその他の HTML または MediaWiki タグが使用されている場合でも、入力pagename パラメータに埋め込まれたリンクを処理しないため、機能しません。
{{#titleparts: red/#00FF00/blue | 1 | 3 }} → "". 「#」もページ名では不正なので機能しません。
警告警告:ページ名の一部が「.」または「..」だけの場合、#titleparts は文字列を解析しません。
{{#titleparts: one/./three | 1 | 1 }}one/./three. 文字列全体が返されます。期待どおりの結果は生成されません。one
警告警告:この関数は、入力が UTF-8 で 255 バイトを超える場合、入力文字列を適切に劣化させません。入力文字列が 256 バイト以上の場合は、文字列全体が返されます。


文字列関数

メインのページ:Extension:ParserFunctions/String functions

ParserFunctions 拡張機能は、$wgPFEnableStringFunctionstrue に設定されている場合、オプションでさまざまな文字列関数を定義します:

  • #len
  • #pos
  • #rpos
  • #sub
  • #count
  • #replace
  • #explode
  • #urldecode

解説は特設したサブページ、例えばManual:Performing string operations with parser functionsを参照してください。

警告警告:2013 年に、これらの機能は大規模に使用すると非効率であるため、Wikimedia Wiki では決して 有効にしないこと が決定されました (履歴についてはphab:T8455 を参照してください)。これらの機能はWikimedia wikiでは動作しません。

Wikimedia プロジェクトについて何かを書くためにここに来ているのであれば、何か他のものを探していることになります。ホーム Wiki に文字列関数がある場合は、おそらくLua が使用されています。 たとえば、英語版 Wikipedia ではModule:String が使用されていますが、これは構文が大きく異なりますが、同じことの一部を実行します。 個別の文字列処理テンプレートもあります。

Module:String 関数の簡単な概要は次のとおりです。

  • #len (文字列の長さ):{{#invoke:String|len|target_string}}
  • #sub (部分文字列):{{#invoke:String|sub|target_string|start_index|end_index}}
  • #match:{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
  • #pos (ターゲットの位置):{{#invoke:String|pos|target_string|index_value}}
  • #find:{{#invoke:String|find|source_string|target_string|start_index|plain_flag}}
  • #replace:{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}
  • #rep (繰り返し):{{#invoke:String|rep|source|count}}
  • #escapePattern:{{#invoke:String|escapePattern|pattern_string}}
  • #count:{{#invoke:String|count|source_str|pattern_string|plain_flag}}
  • #join:{{#invoke:String|join|separator|string1|string2|...}}

全般的な情報

subst展開

パーサー関数のsubst展開は、ハッシュ記号の前にsubst:を足します。

{{subst:#ifexist: Help:Extension:ParserFunctions/ja | [[Help:Extension:ParserFunctions/ja]] | Help:Extension:ParserFunctions/ja }}[[Help:Extension:ParserFunctions/ja]] というページが存在するため、コード Help:Extension:ParserFunctions/ja がウィキテキストに挿入されます。
警告警告:式に変数や他のパーサー関数などの「置換されていない」揮発性コードが含まれている場合、置換されたパーサー関数の結果は未定義になります。一貫した結果を得るには、評価される式内のすべての揮発性コードを置換する必要があります。Help:Substitution を参照してください。

Subst展開は‎<ref>‎</ref>; では機能しないので、予測する結果を得るには{{subst:#tag:ref|}} を使ってください。

リダイレクト

中でも{{#time:…|now-…}} は文中に日付を含むページのリダイレクトで特に利便性が高そうに見えても、実用上は機能しません。

パイプ記号のエスケープ

表の場合

パーサー関数はウィキ記述の表wikitable の構文を断ち切りパイプ記号 (|) に与える役目を変質させ、生のパイプ記号は単に変数の区切り子として扱います。回避策として過去にはほとんどのウィキでTemplate:! テンプレートを使い生のパイプ記号 (|) 単体のみ記していたところ、MW 1.24 以降はこの苦しい方法に代わって{{!}} マジックワードが使えます。これは見た目にパイプ記号を MediaWiki 関数に対して〈不可視化〉することで、特定のページ内のテンプレート類や変数がすべて展開するまで、処理の対象として保留されます。そして表の列や行の区切り子として解釈されます。代案として生の HTML 形式の関数の表を使う方法もあり、ただし直感的に記述しにくくエラー発生の確率も高めです。

パイプ記号|は、解釈していない(平文の)文字としてエスケープすることも可能です。これには HTML エンティティまたは&vert;を使います。

説明入力内容結果
パイプ記号を表の行/列区切りとしてエスケープ
{{!}}
|
パイプ記号をプレーンな文字としてエスケープ
&#124;
|

テンプレート呼び出しの場合

以下の例でも、パイプ記号の保護機能が適用されます。

{{Documentation|content=... text before ...<code>subpage-name=sandbox3</code> is equivalent to <code>sandbox link=../sandbox3 | sandbox name=sandbox3</code>.... text after ...}}

sandbox name=の直前にパイプ記号|が存在する場合にtext afterが表示されない理由は、テンプレートDocumentationのパラメータとして|sandbox name=|content=が同じレベルと誤認されるからです。

空白類の除去

空白 (改行、タブ、空白アキ) はパーサ関数の全パラメータの開始から終了まで除去します。これを回避するには、引用符で囲んでから文字列を比較します。

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

then 部分および else 部分での空白の除去を回避する方法はm:Template:If を参照してください。空白の代わりに <nowiki> </nowiki> を使用することもできます。

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

ただし連続する複数の空白文字はパーサにより1文字に圧縮されるため、この方法により処理できるのは1文字の空白文字に限定されます。

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

このサンプルではwhite-space: pre 書式を採用してブラウザ上で非表示でも、空白スペースが保持されるように強制します。ソフトウェアにより、ブラウザに渡す前に空白文字が除去されるため発生します。

この挙動を回避するには、ソフトウェアによって置換されないように空白類を&#32; (改行可能空白) または&nbsp; (改行不可空白、nbsp) に置換します。

<spanstyle="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

パラメータ同士の重みづけは同等でない点にご注意ください。パーサ関数 ParserFunctions では、冒頭と末尾の空白スペースは常に除去されます。テンプレートでは冒頭と末尾の空白スペースは名前付きパラメータと名前をつけた名無しパラメータに関しては除去、ただし名無しのままのパラメータからは除去しません :

foo{{1x|content= bar}}foofoobarfoo
foo{{1x|1= bar}}foofoobarfoo
foo{{1x| bar }}foofoo bar foo

その他のパーサー関数

大文字小文字の切り替え関数

  • 小文字:"{{lc: AbC}}" → "abc"[1]
  • 大文字:"{{uc: AbC}}" → "ABC"[2]
  • 小文字の頭文字:"{{lcfirst: AbC}}" → "abC"[3]
  • 大文字の頭文字:"{{ucfirst: abc}}" → "Abc"[4]

コード化の関数

  • URL のエンコード:
"{{urlencode: AbCdEf ghi}}"

次のように表示


"AbC%0AdEf+ghi"


そこで内部の新しい行は %0A に、内部の空白は + に変換されます。

アンカーの符号化

{{anchorencode: AbC dEf ghi}}

次のように表示


AbC_dEf_ghi


関連項目

脚注

  1. 2011年のr86805以前とは扱いが変わりました。
  2. phabricator.wikimedia.orgのExtParserFunctions.phpを参照してください。
すべて
関連項目
Retrieved from "https://www.mediawiki.org/w/index.php?title=Help:Extension:ParserFunctions/ja&oldid=7751122"
Categories:
Hidden category:

[8]ページ先頭

©2009-2025 Movatter.jp