メモ:regex_replaceとダイナミックとスタティック

regex_replaceモディファイアでスタティックパブリッシングとダイナミックパブリッシングで分岐させてみようとおもったので動作のメモとして記しておきます。

小粋空間さんの以下のページにはダイナミックパブリッシングにおいて正規表現の後方参照の$をエスケープしないと期待どおりに出力されないといったことが記されております。

(これといって重要なことでもないのですが)それならばダイナミックとスタティックで振り分けてみようかと思ってやってみたのです。解説できるほどのスキルはありませんので、動作を試したテンプレートのコードをそのまま載せておきます。(確認はMTOS5.02/Movable Type Pro 4.27-jaによる)


<!-- 
     ex1
-->

<ul id="ex1">
<MTFor var="x" from="1" to="10">
<MTIfDynamic>
<li><MTVar name="x" regex_replace="/(\d)/","No.\$1"></li>
</MTIfDynamic>
<MTIfStatic>
<li><MTVar name="x" regex_replace="/(\d)/","No.$1"></li>
</MTIfStatic>
</MTFor>
</ul>

<!-- 
     ex2
-->
<$MTSetvar name="regexp" value="/(\d)/"$>
<$MTSetvar name="rep" value="No.$1"$>
<ul id="ex2">
<MTFor var="x" from="1" to="10">
<li><MTVar name="x" regex_replace="$regexp","$rep"></li>
</MTFor>
</ul>

まあキャプチャする必要のないサンプルですが失敗してるか成功してるかわかりやすそうなものということで。

ざっと思いつくのは、ex1のようなコードかと。それから奮闘した結果、いいのかわるいのか分かりませんが、結局変数に渡してドル記号つきで参照することでどちらでも同じといった感じでした。

いちおうコンパイルされたほうのテンプレートでsetvarの部分です。

<?php $this->_tag_stack[] = array("mtsetvar", array (
  'name' => 'regexp',
  'value' => '/(\\d)/',
));  echo smarty_function_mtsetvar(array('name' => 'regexp','value' => "/(\d)/"), $this); array_pop($this->_tag_stack); ?>

<?php $this->_tag_stack[] = array("mtsetvar", array (
  'name' => 'rep',
  'value' => 'No.\\$1',
));  echo smarty_function_mtsetvar(array('name' => 'rep','value' => "No.\$1"), $this); array_pop($this->_tag_stack); ?>

Comments:

コメントをどうぞ。書き込む場所が不明な場合やサイトオーナーへのコンタクトは、GuestBookまでお気軽にどうぞ

blog comments powered by Disqus