Smartyの修飾子regex_replaceで正規表現の後方参照・PHPではpreg_replace
2017/03/11
ECCUBEのSmartyの修飾子regex_replaceで後方参照
Smartyの装飾子 regex_replaceの後方参照
ECCUBEをカスタマイズしている際に、文字列を正規表現で置換し、後方参照でマッチした値の一部を参照して編集する必要がありましたが、Smartyの後方参照は独特の問題がありますのでそこも含めて解説を行います。
ECCUBEはテンプレートに Smartyを使っていますので、テンプレートファイル上で置換を行う場合は、Smartyの仕様に従って記述する必要があります。
Smartyにおいて正規表現で置換を行う場合は、regex_replaceという修飾子を利用します。
後方参照というのは、
aaa.html
を、「aaa」の部分を正規表現で一致させつつ、「aaa」の部分を残して
aaa.php
に置換するという処理のことです。
Smartyの装飾子 regex_replaceの後方参照の具体的な記述方法
「商品コード+商品名」で登録している値を「商品コード<br>商品名」にしようとしました。
また、「商品コード+商品名」の条件は、以下の通り。
1.商品コードは数値のみ。
2.商品コードと商品名の間には半角スペース。
3.商品名には半角スペースが入っている可能性あり。
3番がなければ非常に簡単だったのですが、2番のスペースと 3番のスペースを切り分けるための正規表現が必要になりました。
phpの preg_replace()で記述する場合は、下記の様になります。
1 |
preg_replace("/^(\d+)\s/", "$1<br>", $main_list_comment); |
Smartyの場合は、「regex_replace」という装飾子を利用して下記の様に記述します。
1 |
<!--{$main_list_comment|regex_replace:'/^(\d+)\s/':'$1<br>'}--> |
後方参照の指定の仕方は「$1」「$2」「$3」...ですので、phpの場合と変わりありません。
ですが、各項目を区切るのは「”(ダブルクォート)」では正常に動作せず、「’(シングルクォート)」でなくてはいけません。
後方参照をせず置換を行うだけならダブルクォートで問題ありません。
「Smartyの Syntax Errorの原因はスペースかも」でも書いていますが、Smartyはスペースを編集することで動かなくなることは多々あり、regex_replaceも区切り項目の「:(コロン)」の前後にスペースが入ると正常に動作しなくなります。
また、今回は利用していませんが、正規表現で桁数を指定する「{n}」という表現が使用できません。
例えば、正規表現で「数値 3桁」の場合は「\d{3}」と書くわけですが、Smartyの装飾子「regex_replace」ではこの表現は使えず、「\d\d\d」と原始的な対応をする必要が出てきます。
3桁くらいなのでこれでも仕方がないかと思いますが、桁数が増えたらどうするんでしょうね?
正規表現の後方参照の別の表現
正規表現の後方参照については、先にも書きましたが、
aaa.html
を、「aaa」の部分を正規表現で一致させつつ、「aaa」の部分を残して
aaa.php
に置換するという処理のことです。
ですが、「後方参照」という言葉はあまり広く一般的に認知されている言葉ではないようです。
以前「テキストエディタ秀丸で正規表現による置換の方法の解説」という秀丸の正規表現で置換する記事を書きましたが、秀丸の場合は「タグ付き正規表現」と呼ぶようです。
その他、検索文字列タグ、正規表現タグといった表現も見受けられました。
また、この後方参照はプログラム言語によって扱いが違う場合もありますので、言語が変わる場合はマニュアル参照が必須のようですね。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
PHPのソースで見慣れない記号が出てきた・アロー演算子(->)、ダブルアロー演算子(=>)
PHPのプログラムソースには見慣れない記号が出てきます。その意味や調べ方です。
-
-
パーミッション(属性)一括変更ツール・WordPress最適化済
WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。
-
-
リダイレクトループが原因で「ERR_TOO_MANY_REDIRECTS」「このページを表示できません」が出たときの対策12事例+α
リダイレクトループ、自動転送設定ループの原因の解説とその対応方法を含め事例 12例を挙げて説明。
-
-
ECCUBE2.13.3で商品規格の在庫数が無制限から変更できないバグがある
2.13.3固有のバグである商品規格の在庫数の入力エリアがアクティブにならない不具合を解消する解説です。product_class.tplの2行を修正するだけの簡単対応です。
-
-
ECCUBEでテンプレートファイルのファイルサイズは10MB以下のものを使用してくださいのエラーが出た場合
テンプレートをアップロードする際にファイルサイズが大きすぎてエラーが表示される際の対処方法解説。パラメータ設定で設定する制限について解説を行っています。
-
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
-
ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について
レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。
-
-
ECCUBEでアップロードできない。upload_max_filesizeを設定する場所
テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。
-
-
ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説
ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。
-
-
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。