Smartyの正規表現置き換えにはpreg_replaceではなくregex_replace【備忘録】

テンプレート作成中にちょっと引っかかったので備忘録として残しておきます。カラーミーショップをカスタマイズしたい誰かの役に立つかも知れません。

文字列から数字を削除、または数字を取り出したい

カラーミーのテンプレートファイルは基本smartyで作られています(バージョンは2.6)。

smartyはなんとなくでもphpを知っていればすぐに理解できると思うので、とにかくカスタマイズしたい人はphpを学ぶと良いです。WPをさわるならphpは必須ですし、覚えて損することは決してない言語です。

今回、カラーミーの変数(= 独自タグ)から数値のみを取り出したい場面がありまして、preg_replaceで置き換えしようとしたらエラー

何でかなと思ったら、smartyではregex_replaceを使うようです。

正解を書いておくとこうなります。

// 例1:$hogeから文字だけを取り出す(数字を削除)
{$hoge|regex_replace:"/[0-9]/":""}

// 例2:hogeから数字だけを取り出す(数字以外を削除)
{$hoge|regex_replace:"/[^0-9]/":""}
  1. 検索語を正規表現でチェックするので「/正規表現/」のように「/」で囲む。それをクォーテーションで囲む(個人的には違和感があります、、)
  2. [0-9]は文字クラス。0〜9のいずれかに該当するか検索。例えば[a-z]ならアルファベット小文字を検索。
  3. 文字クラス[ ]内の「^」は否定。0〜9以外( = 文字)を検索。
  4. 検索した語を ”” (空白)で置き換えする = 削除 という流れ。

regex_replaceの後方参照

上のコードは、一致するものを削除することで必要な部分を取り出すやり方ですが、一致した部分を直接取り出す方法もあります。

正しくは後方参照と言うそうです。

パターンを作成して、一致した部分を参照する

例として、「123,456円(税込)」という文字列が入っている$price という変数があるとします。

ここから数字部分だけを取り出す場合、以下のコードとなります。

{$price|regex_replace:"/([0-9])/":'$1'}  {* 出力される値 :「123456」*}

注意点は、

1・正規表現をパターン化する (()で囲む

2・2番目の引数にダブルクォーテーションを使用するとエラーとなるので、必ずシングルクォーテーションを使う。1番目はどちらでも良い(カラーミーの場合。他は知りません)

です。

一致した部分が $1 で出力されます。

仮に、「【123456】」と出力したい場合は、

{$price|regex_replace:"/([0-9])/":'【$1】'}

で、OKです。

smarty
シェアする
タイトルとURLをコピーしました