エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


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()で記述する場合は、下記の様になります。

 
Smartyの場合は、「regex_replace」という装飾子を利用して下記の様に記述します。

 
後方参照の指定の仕方は「$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
に置換するという処理のことです。
 
 
ですが、「後方参照」という言葉はあまり広く一般的に認知されている言葉ではないようです。
以前「テキストエディタ秀丸で正規表現による置換の方法の解説」という秀丸の正規表現で置換する記事を書きましたが、秀丸の場合は「タグ付き正規表現」と呼ぶようです。
 
その他、検索文字列タグ、正規表現タグといった表現も見受けられました。
 
 
また、この後方参照はプログラム言語によって扱いが違う場合もありますので、言語が変わる場合はマニュアル参照が必須のようですね。

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()

XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。

Basic認証の.htaccess、.htpasswd生成ツールと解説

Basic認証を設定する際に必要となる.htaccess、.htpasswdファイルを生成するツール。ID、PASS、.htpasswdへのパスを入力することで編集する情報を生成します。

GMOペイメントゲートウェイのjava.io.IOExceptionのエラー

ECCUBEの決済でGMOペイメントゲートウェイのモジュールを使ってテスト決済を行った場合の不具合、java.io.IOExceptionと言うエラーの原因と対策方法の解説です。

include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由

include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。

PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方
PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方

PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方を解説。要素を取得する方法、そこから属性を取得する方法を解説。また、マニュアルにはない注意点なども解説。

ECCUBEでアップロードできない。upload_max_filesizeを設定する場所

テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。

ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について

レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。

PHP画面が真っ白 header(“Location: $url”);

PHPの開発で header(“Location: $url”);を使うと画面が真っ白になる不具合が出る場合もあります。

QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)作成サービスを公開

QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。

PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法
PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法

「PHP スクレイピング」で検索すると「phpQuery」ばかりヒットするが、10年以上も放置されている。なので今も開発が続いている「PHP Simple HTML DOM Parser」をオススメする。