regex_replace モディファイアをダイナミックパブリッシングで利用する場合の注意

regex_replace モディファイアをダイナミックパブリッシングで利用する場合の注意

Posted at November 20,2009 1:55 AM
Tag:[Modifier, MovableType, 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); ?>

ということでお試しください。

関連記事
トラックバックURL


コメント

こんばんわ^^

うちでもダイナミック・パブリッシングを利用してますが、特にエスケープしなくっても期待通りの置換がされてます(*^_^*)
具体的には以下のようなかんじです。

<$mt:ArchiveTitle regex_replace="/^.*<(.*)>$/","\$1" setvar="page_title"$>

上記はカテゴリ名称から特定の名称を抜き出すことをやってます。
MT のバージョンによるものなのか、MTPerDynamic プラグインを利用してるからなのかは不明ですけど(; ̄ー ̄A

以上ご報告まで。

[1] Posted by bzbell logo : November 21, 2009 12:10 AM

>bzbellさん
こんばんは。
情報ありがとうございました。
デフォルトのダイナミックパブリッシングはPHP(Smarty)で動作するので後方参照が動作しなくなるようです。
ではでは!

[2] Posted by yujiro logo : November 21, 2009 11:32 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)