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のcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
-
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。
-
-
GMOペイメントゲートウェイのjava.io.IOExceptionのエラー
ECCUBEの決済でGMOペイメントゲートウェイのモジュールを使ってテスト決済を行った場合の不具合、java.io.IOExceptionと言うエラーの原因と対策方法の解説です。
-
-
カオナビAPI Ver.2.0のtokenを取得する PHP+cURLのサンプルプログラム
PHPのcURLを使用してカオナビAPIのアクセスに必要なtoken、シートの情報を取得するサンプルプログラムを作成。cURLの処理は関数化しているため他のAPIでも流用できる。
-
-
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
PHPのデバッグ等で変数や配列の中身を確認するために使用する関数print_r、var_dump、var_exportの動作の違い、仕様の違いについて確認した。var_exportがオススメ。
-
-
ob_start、ob_get_contents関数でPHPの標準出力をバッファリング・変数に代入
標準出力をバッファリングし変数に代入することができるob_start()関数の解説。include()の処理をバッファリングすることで自由な場所に処理を記述することが可能。
-
-
連想配列のキーも値もまとめてhtmlspecialchars()でサニタイズする関数の作成解説
PHPの配列・連想配列のキーと値をまとめてhtmlspecialchars()関数でサニタイズ(無害化、無毒化)を行う関数を作成。連想配列のキーはarray_map()関数でのサニタイズは無理。
-
-
ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定
Googleは関連あるページはその旨明示するよう求めています。ECCUBEの商品一覧ページでその求めに応じるための「rel=”next”」「rel=”prev”」について解説します。
-
-
WindowsのXAMPPのPHPではstrptimeは使用不可。代替はdate_parse_from_formatを使う
strptimeはWindowsのPHPには未実装。LinuxとMacで挙動が異なる。PHP8.1で非推奨になる。なので日付のチェックはdate_parse_from_formatを使おう。使い方を詳細解説。
-
-
PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法
「PHP スクレイピング」で検索すると「phpQuery」ばかりヒットするが、10年以上も放置されている。なので今も開発が続いている「PHP Simple HTML DOM Parser」をオススメする。