Published on

smartyのregex_replaceで正規表現を使ってのif文

Authors

smartyで正規表現を使って検索・置換をする方法と、それをif文で使う方法です。結構使うんですが、いつも忘れてしまうのでメモしておきます。

{if $foo|regex\_replace:'/.\*test.\*/i':'test' == 'test'}
    画像1
{else}
    画像2
{/if}

変数fooの中にtestという文字が含まれていれば画像1を表示させて、含まれていなければ画像2を表示させます。

fooという変数の中をregex_replaceを使って検索して、もしその文字列があればfooをtestに置き換えます。その置き換えられたものがtestであればtrueになるという感じです。同じテキストを3回書かないといけないのが難点ですが、便利なのでよく使っています。

regex_replace

変数に対して正規表現を使って検索・置換を行います。phpではpreg_replaceです。正規表現を使わずに検索・置換を行うにはreplaceを使います。

{$foo|regex\_replace:'/.\*test.\*/i':'event'}

/.*test.*/iのiの部分をパターン修飾子というのですが、ここでは省略します。

正規表現

正規表現とは何かを簡単に説明すると、「テキスト本文を検索するときに使う文字列」とでも言えばいいのでしょうか。全て理解しているわけではありませんが、この正規表現とうものを知った時、僕の中でプログラミングの世界がとても広がったなと思いました。

正規表現の中でよく使うものをメモしておきます。

.(ピリオド) → 任意の一文字、とにかくなんでもいい一文字
^(カレット) → 行の最初(キーボードでは0の2つ右)
$(ドル記号) → 行の最後(キーボードではシフトを押しながら4)
\*(アスタリスク) → 直前の文字の繰り返し(キーボードではシフトを押しながら:)

直前の文字の繰り返しには*の他に+(プラス)と?(クエスチョン)がありますが、ここでは省略します。

.*test → なんでもいい一文字を繰り返した後に出てくるtestまで
^.*test → 一番最初からなんでもいい一文字を繰り返した後に出てくるtestまで
test.*$ → testからなんでもいい一文字を繰り返して最後まで

これらの正規表現で使われる文字をメタ文字と言いますが、テキストの中にこのメタ文字が出てくる場合には\(円記号、キーボードでは0の¥3つ右)を使ってエスケープしなければなりません。

 

正規表現による検索・置換がsmartyではregex_replaceでphpではpreg_replaceとなぜ違うんだろうと不思議に思います。