2023.02.21 システム
insource-???KET??G D?SIGN-のクエスチョンマークを置き換える(PHP)
よく見てください↓ わが社のロゴをジーっと見ると、文字の色が違うところがあるんです。
小さいロゴだと全然気が付かないんですが、「MARINE(海)」の文字だけ、黒じゃなくて灰色がかった青緑色なんです。
海なし県の栃木県にこの会社はあるのですが、こっそり「海」が社名に入っています。
旧社名がマリンロードだからだと思いますが、気が付いたときにロゴの言葉遊びにうれしくなりました。
プレースホルダを設定して置換する
私はPHP初学者なのでPHPの教本を読んでいたのですが、テキストに必ず出てくる技術で「プレースホルダ(後からデータを入れるために場所を仮に確保する)」というのがあります。
文章の途中に「?」マークを書いて場所を確保しておいて、あとでその「?」の部分を置き換えるという方法を使います。
どこで使うかというと、データベースからデータを取り出すための条件をプログラム内に「文章」で書くのですが、例えば条件の文章中のidの内容の部分だけ、あとで別のデータを入れ替えたいというときに使います。
id = ? ←この?部分を入れ替える。
なんでこんなやり方をするかというと意図しないデータベースへのアクセスを防ぐセキュリティのためです。データが変わるところ以外は悪意のある人から変更されないように文字を固定しておくのです。
とはいえ「?」を文章中に複数入れておいて、あとから複数置き換えの指定するのは便利です。
VALUES (?,?,?,?,?) | ←文章の中に用意しておいた「?」5個 |
fruits [‘apple’,’banana’,’orange’,’strawberry’,’melon’] | ←あとから入れたいデータ5個を置き換える。 |
データベースの問い合わせ用には……$stmt->bindValue(置き換える中身を指定)みたいな感じに書いて用意しておいた条件の文字を置き換えて使うのですが、教本にはデータベースに問い合わせする途中の時に使う流れでbindValue()という関数を使うということしか「?」の置き換えの例が載っていませんでした。これだとデータベースの問い合わせするときしか使えないのです。
普通の文章中に「?」を書いておいて、用意しておいた文字で差し替えができたら便利ですよね。
データベースの問い合わせでこんなカタチのやり方があるなら、ほかの用途にも同じように文字を置き換えて表示ができるはずと、思ったので他の関数を使って、同じように文字の置き換えをする方法を考えてみました。
結論から言うと、PHPで「?」は特別な意味のある記号なので、ちょっと苦労しました
PHPの文字のリプレース(文字の置き換え)関数は……わーい。いっぱいあるー。
- str_replace() ←検索文字列に一致したすべての文字列を置換する
- str_ireplace() ←大文字小文字を区別しない str_replace()
- strtr() ←文字の変換あるいは部分文字列の置換を行う
- substr_replace() ←文字列の一部を置換する
- mb_ereg_replace()←マルチバイト文字列に正規表現による置換を行う
- preg_replace() ←正規表現検索および置換を行う
どれ使おう……というかどれを使ったら、できるかしらん。
一種類の文字を、用意した場所全部に置き換えてしまうとかは簡単なのですが、複数の文字を順番に充てていくというのは、少し考えないとできませんでした。
試行錯誤の過程は流石に長すぎるので端折りますが、このブログの冒頭の社名の隠し文字を置き換えてみました。
$company = ‘insource-???KET??G D?SIGN-‘;//←この文章中の?を置き換える。
$secret = [‘M’,’A’,’R’,’I’,’N’,’E’];//文章中の?に対して左から1文字ずつ置き換える。
foreach ($secret as $strS) {
$company = preg_replace(‘/[?]/’, $strS, $company, 1);
}
こんな感じでシンプルにできました。パズルみたいで楽しいですね。