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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定
Googleは関連あるページはその旨明示するよう求めています。ECCUBEの商品一覧ページでその求めに応じるための「rel=”next”」「rel=”prev”」について解説します。
-
-
PHPで正規表現の検証には preg_match_allが便利
PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。
-
-
PHPパーミッション変更のchmod関数・モードを変数で指定する方法
パーミッション変更関数であるchmod関数の第二引数、ファイルモードの指定に変数を使う場合は8進数に変換するoctdec関数を使って変換します。
-
-
Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説
お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。
-
-
QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。
-
-
サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない
PHPでショートタグを使うのは危険。サーバ移転やバージョンアップで動かなくなる!ソースが丸見え、設定情報流出のリスクが!php.iniのshort_open_tagの設定を再確認。
-
-
PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!
-
-
配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例
配列の値を「、」でつないで出力する際、単純にforeachで繰り返し処理をすると「イヌ、サル、キジ、」となるが文字列最後の「、」を出力しない方法を3つ解説している。
-
-
ファイル変更だけ!ECCUBEの本番から開発環境をコピーする手順を解説
ECCUBEを本番から開発環境をコピーする際の手順を解説。PGMメンテに必要な開発環境を構築する手順を解説。ECCUBEの仕組みは簡単なので作業は5分ほど。
-
-
sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる
PHPのプログラム処理を遅延させる「sleep()」は整数秒単位。「usleep()」は1秒未満のマイクロ秒単位。では「1.5」秒はどう表現するのか。「sleep()」「usleep()」を組み合わせる。その解説。