茨城県取手市で働くWebクリエイター馬場誠のサイト(2018/東京から茨城に移住しました)

Smartyから他のViewに変えた際の正規表現メモ


Smartyが使われているWebシステムのView部分を、他のものに変更するときに遭遇した正規表現のメモ。
※Dreamweaver上での正規表現です。

分かる人からすればほんとうにたわいもないことですが、
正規表現を忘れさせたら右に出るものはいない私が、恥をしのんでお送りします(笑)

まずは念のためviewのディレクトリをバックアップしておき、
{を<?phpに、}を?>等に、適当に置き換えました。

<?php $value; ?>を<?php echo h($value); ?>に

その後、当然ながらこんな感じの部分
<?php $value; ?>
がたくさんに。

Smartyは、デフォルトでescape:”htmlall”がかかるように運用していた(←個人的にはあまり好きではないのですが)ので自動的にエスケープされていたのですが、Viewを変えるので、このままではマズいです。

なので、先ほどの場合なら、
<?php echo h($value); ?>
と、こんな感じにしたい。
※h()は、htmlspecialchars的な自作関数

そんな訳で、正規表現で検索置換。
検索条件は下記です。
<\?php (.*); \?>
(.*のところ大雑把ですが(汗))

置換欄はこんな感じです。簡単ですね。
<?php echo h($1); ?>

念のため一括置き換えにせず、
きちんと動くか何個か置き換えていたのですが、
問題なく変換できている模様。

……と思ったら、あるところで、余計な部分まで(下記全て)マッチしちゃいました。
<?php $item.name; ?><br /><?php $item.email; ?>

この場合、同じ行の最後の; ?>までマッチしてしまうんですね。

確かこんなのやったなぁ~と思ったのですが、
どう考えても初歩的っぽいですが対処法はもう忘れてます。(笑)

そんな訳で、いろいろ検索していたら思い出しました。
<\?php (.*?); \?>
のように、?を入れたらいいんですね。

追記: 後から考えれば、やはり
<\?php \$([a-zA-Z0-9_]+); \?>

<?php echo h($$1); ?>
に置き換える方が、ふさわしいです。
.*はちょっと大雑把にしすぎ&楽しすぎました。
(作業中はスピード重視なので、ついつい楽できる方をやってしまうんですよね。これは反省です。)

<?php $user.name; ?>を<?php echo h($user[‘name’]); ?>に

あともう一個。
{ }を単純に<?php ?>に置き換えると、こんなのもたくさんでてきます。
<?php $user.name; ?>

これは、配列なので、先ほどの正規表現で置き換えちゃうとよろしくないです。
下記のように
<?php echo h($user[‘name’]); ?>
するために、

<\?php \$([a-aA-Z0-9_]+)\.([a-aA-Z0-9_]+); \?>
で検索して、
<?php echo h($$1[‘$2’]); ?>
に置き換えて解決です。
(※本来なら、最初にご紹介した方よりも、こちらの方を先にやってしまった方がいいです)

正規表現って本当に便利!

というか、あたりまえですが、これだけではなく本当はもっとたくさん置換しました。
正規表現を使わなかったらこの何倍(何十倍!?)時間がかかったのかと思うと、よかった~と思います。

フリーランス駆け出しのころは、正規表現はなんとなく知っていたけど、
(自分が至らなかったために)行錯誤する方が時間がかかることが多かったのであまり使いませんでした。
最近は正規表現の方が早くなってきたので、結構使っている気がしますね。
正規表現、プログラムを書かないWebデザイナーさんにも、ぜひお勧めしたいです。

コメントを残す

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

CAPTCHA