regex_replace モディファイアをダイナミックパブリッシングで利用する場合の注意
Movable Type の小ネタです。
regex_replace モディファイアでグループ化と後方参照($1など)を利用する場合、次のように記述します。
<mt:GetVar name="foo" regex_replace="/(.*)/","No.$1" />
上の例では、変数 foo の値が「1」であれば、出力は「No.1」となります。
テンプレートをダイナミックパブリッシングにすると、このままの記述では regex_replace モディファイアは正常に動作せず、出力は「No.」となってしまいます。
期待通りに動作させるためには、後方参照の「$」をエスケープします。
2018.01.30追記:エスケープせずにOKになるケースもあります。
<mt:GetVar name="foo" regex_replace="/(.*)/","No.\$1" />
ちなみに、上記のテンプレートタグをダイナミックパブリッシングのソースコードに展開したものを掲載しておきます。
エスケープなし(NGになるケース)
<?php /* Smarty version 2.6.13, created on 2009-11-21 23:25:15
compiled from mt:1872 */ ?>
<?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' => array(array('function', 'mtgetvar', 'mt:1872', 4, false),array('modifier', 'regex_replace', 'mt:1872', 4, false),)), $this); ?>
<?php $this->_tag_stack[] = array("mtgetvar", array (
'name' => 'foo',
'regex_replace' => '/(.*)/',
)); echo ((is_array($_tmp=smarty_function_mtgetvar(array('name' => 'foo'), $this))) ? $this->_run_mod_handler('regex_replace', true, $_tmp, "/(.*)/", "No.".($this->_tpl_vars['1'])) : $this->_plugins['modifier']['regex_replace'][0][0]->regex_replace($_tmp, "/(.*)/", "No.".($this->_tpl_vars['1']))); array_pop($this->_tag_stack); ?>
エスケープあり(OKになるケース)
<?php /* Smarty version 2.6.13, created on 2009-11-21 23:25:53
compiled from mt:1872 */ ?>
<?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' => array(array('function', 'mtgetvar', 'mt:1872', 4, false),array('modifier', 'regex_replace', 'mt:1872', 4, false),)), $this); ?>
<?php $this->_tag_stack[] = array("mtgetvar", array (
'name' => 'foo',
'regex_replace' => '/(.*)/',
)); echo ((is_array($_tmp=smarty_function_mtgetvar(array('name' => 'foo'), $this))) ? $this->_run_mod_handler('regex_replace', true, $_tmp, "/(.*)/", "No.\$1") : $this->_plugins['modifier']['regex_replace'][0][0]->regex_replace($_tmp, "/(.*)/", "No.\$1")); array_pop($this->_tag_stack); ?>
ということでお試しください。
Posted by yujiro このページの先頭に戻る
- Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法
- Movable Typeの月別コンテンツアーカイブリスト用テンプレート
- コンテンツデータでMTEntriesWithSubCategoriesの代替テンプレートタグ
- MTContentFieldタグの使い方
- Movable Typeでブログ記事一覧をカスタムフィールドでソートする方法
- MTの本文フィールドからimg要素のURLを取得する方法
- MTEntriesタグで指定した数の記事を除外して表示する方法
- Movable Typeのテンプレートタグの中でテンプレートタグを使う方法
- Movable Typeのテンプレートタグをテンプレートで生成する方法
- Movable TypeのMTEntriesタグで特定の複数ブログ記事を出力する方法
- Movable TypeでCSVデータからtable要素を作る方法
- MTIncludeタグのnameモディファイア
- Movable Type(MT)の特殊変数の入れ子
- ブロックタグにelseタグを組み込んで判定する
- Movable Type 5 におけるウェブサイトとブログの複数指定方法
トラックバックURL
コメント
こんばんわ^^
うちでもダイナミック・パブリッシングを利用してますが、特にエスケープしなくっても期待通りの置換がされてます(*^_^*)
具体的には以下のようなかんじです。
<$mt:ArchiveTitle regex_replace="/^.*<(.*)>$/","\$1" setvar="page_title"$>
上記はカテゴリ名称から特定の名称を抜き出すことをやってます。
MT のバージョンによるものなのか、MTPerDynamic プラグインを利用してるからなのかは不明ですけど(; ̄ー ̄A
以上ご報告まで。
>bzbellさん
こんばんは。
情報ありがとうございました。
デフォルトのダイナミックパブリッシングはPHP(Smarty)で動作するので後方参照が動作しなくなるようです。
ではでは!
[2] Posted by yujiro : November 21, 2009 11:32 PM
コメントする
greeting