2009年11月20日
regex_replace モディファイアをダイナミックパブリッシングで利用する場合の注意
Movable Type の小ネタです。
regex_replace モディファイアでグループ化と後方参照($1など)を利用する場合、次のように記述します。
<mt:GetVar name="foo" regex_replace="/(.*)/","No.$1" />
上の例では、変数 foo の値が「1」であれば、出力は「No.1」となります。
テンプレートをダイナミックパブリッシングにすると、このままの記述では regex_replace モディファイアは正常に動作せず、出力は「No.」となってしまいます。
期待通りに動作させるためには、後方参照の「$」をエスケープします。
<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 このページの先頭に戻る
- MTInclude タグの name モディファイア
- Movable Type(MT)の特殊変数の入れ子
- ブロックタグにelseタグを組み込んで判定する
- Movable Type 5 におけるウェブサイトとブログの複数指定方法
- ウェブサイトとブログでグローバルナビゲーションを共有する
- Movable Type のアーカイブページへのリンクを相対パス(ホストからの相対URL)で表示する
- include_with_website モディファイア
- Movable Type の記事中の&を&に変更する方法
- Movable Type テンプレートタグの簡略化まとめ
- Movable Type のテンプレートタグでよくある5つの書き間違い
- Movable Type で他のブログのテンプレートモジュール・ウィジェットを利用する
- Movable Type のブロックタグにファンクションタグで使うモディファイアを指定する
- MTIf タグの test モディファイアで Perl の式を利用する
- MTIf タグの tag モディファイアでテンプレートタグの値を直接参照する
- Movable Type 4.1 / MTOS における配列とハッシュの利用方法
- MTIf タグの like 属性について
- MTSetVarBlock と MTSetVarTemplate の違いについて
- strip 属性で日付の空白を削除する
- MTIgnore タグ
- エントリーで table タグを記述する場合の注意
この記事を読んだ人はこんな記事も読んでいます
人気エントリー
Hatena Hot Entries
Hatena Entries
トラックバック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
