« fuming | メイン | 書店のインターフェース »

Smartyのregex_replace

PHPのテンプレートエンジン Smarty。高機能で便利。しかし、テンプレート側でロジックに近いものを入れ込むのは果たしてテンプレートとしてOKなのだろうか。

まぁいいや。使う人次第ってことで。

で、smartyの機能に、出力する変数に対し、正規表現を用いて置換することができる。
性器表現痴漢ではない。くれぐれも間違わないように。

間違ってもプログラムに詳しくない人が回りにいる状況で、
「俺って、セイキヒョウゲンチカンって得意なんだよね〜。
なんていうかな。いろんなパターンを想定した俺のセイキヒョウゲンってば、
大抵のものはチカンしちゃうね。」

なんて会話を聞かれたりした日にゃ、タイーホですよ。

まぁ、戯れ言は置いてといて、、、そのsmartyで正規表現を使って、変数中に特定の文字列が含まれていたらそこをdivタグでくくって、表示を少し替えるという処理を作っていた。
・・・・が、なぜかうまくいかない。regex_replaceは、PHPのpreg_replaceと同等の正規表現が使えるとマニュアルに書いてある。置換自体はうまくいくのだが、マッチした文字列の参照ができない。

{$entry.file|regex_replace:"'.*/([^/]+)$'":"$1"}
と、いう処理があったとする。ファイルパスのディレクトリ部分を省いたフィアル名のみを取り出す正規表現である。結果として、ファイル名だけ取り出したいのだが、これがなぜか動かない。
{$entry.file|regex_replace:"'.*/([^/]+)$'":"\\1"}
としてみたが、ダメ。

なぜだろうと、悩むこと数十分。これはsmartyがマッチした文字列の参照という動作に対応してないのではないだろうかと疑い、そもそものDBを作っているNムラっちにヘルプのメールをだそうし、最後に今一度googleで調べてから・・と思い、調べると、ようやく、希望の情報をゲット。(どっかの外人さんも同じ問題で困っていたらしく、外国のPHPのフォーラムみたいなところで同様の回答をゲト)

つまり、"$1"だと、Smarty内部の変数として処理されてしまうため、参照されていなかったらしい。正しくは、

{$entry.file|regex_replace:"'.*/([^/]+)$'":'$1'}
と書く。つまり、$1をシングルクォーテーションでくくるか、ダブルクォーテーションでくくるかの違いなのだ。分かってみれば納得。当たり前。これくらい気づかない自分が愚かしい。

ちなみに、単純にファイル名を得るだけだったら、

{$entry.file|basename}

でもオケーイですよ。と、外人さんがコメントしておりました。

うーん。コレだったら、最初からPHP内で変換しておくか、それように変数をアサインしておいたほうがよいんじゃないかなぁとおもったりおもわなかったり。
デザインとロジックの切り分けのラインをどこで引くかってのは難しいねぇ。

まぁいいや。

コメントを投稿

2008年10月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

最近のコメント

小優 on 日々の記録: DELL4600Cで
よしぞう on 日々の記録: 4600C 表記の対
よしぞう on 日々の記録: 4600C 表記の対
on MySQL後で調べるメモ: DB接続後 目的のS
on 日々の記録: 「無くなった留め具」
on JavaScriptでクロスドメイン: >しかし、こういう小
junp on iMovieで静止画を取り込むと荒い: すいません困ってます
う〜ん・・・ on 素朴な疑問: にょうをした、きたな
困ってました on ATOKとIME2005が勝手に切り替わる問題: 何故か勝手に切り替わ
go on 日々の記録: 4600C、同じ症状

アーカイブ