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で配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!
-
-
PHP画面が真っ白 header(“Location: $url”);
PHPの開発で header(“Location: $url”);を使うと画面が真っ白になる不具合が出る場合もあります。
-
-
Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説
お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。
-
-
include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由
include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。
-
-
乱数発生器(パスワード生成サービス)がバージョンアップで高速化!
乱数やパスワードを生成する乱数発生器を高速化!重複しない10桁、20桁の文字列を10万件、20万件と生成することも可能!イベントのキャンペーンのシリアルコードなどにも利用可能!
-
-
指定した数で文字列を丸める(n文字目で…にする)関数substr、mb_substr、mb_strimwidthの違い
文字列を指定された数で抜き出すPHPの関数、substr、mb_substr、mb_strimwidthについての解説。似た関数だが引数の指定方法が違ったり、文字数がバイト数か文字数かも違ったり、注意が必要だ。
-
-
Smartyのテンプレート内の処理で計算、加工をする方法
Smartyのテンプレート上で変数を計算する、加工する方法を解説します。
-
-
パーミッション(属性)一括変更ツール・WordPress最適化済
WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。
-
-
ECCUBE mtb_constants initパラメータ設定の項目を追加する方法
ECCUBEのパラメータ設定で設定できる項目を追加する方法を説明します。
-
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。