PHP:preg_replaceで勘違いしていた内容

2010/09/12

「●●」「★★」「▼▼」「▼▼」「★★」を
「●●」「★★」「▼▼」「□□」「★★」とするなら
「「最後の▼▼を□□に置きかえ」ってやればOK」
と思い・・・
「preg_replace」(文字列の置き換え)を使うことにした。

まずは
「●●」「★★」「▼▼」「▼▼」「★★」を
「●●」「★★」「▼▼」「▼▼」「□□」としてみる。

  1. $aaa = “「●●」「★★」「▼▼」「▼▼」「★★」”;
  2. $aaa = preg_replace(‘/「★★」$/’, ‘「□□」’, $aaa);
  3. echo $aaa;

でOK。

[/「★★」$/]:
[/]と[/]ではさまれた箇所を置き換える。
で、[$]は最後のって意味合い。
ってことで
つまり「最後の[「★★」]を置き換えろ」ってなる感じ。

じゃぁ次に求めている内容の
「●●」「★★」「▼▼」「▼▼」「★★」を
「●●」「★★」「▼▼」「□□」「★★」ってのをやってみる。、

$aaa = preg_replace(‘/「▼▼」$/’, ‘「□□」’, $aaa);

で良いはずだと思いきや・・・

「●●」「★★」「▼▼」「▼▼」「★★」

と変化なし。

$aaa = preg_replace(‘/「▼▼」(.*)$/’, ‘「□□」’, $aaa);

としてみると

「●●」「★★」「□□」

となる。
[(.*)]は任意の文字たち。
わかりづらいので、[▼▼]の前後の[「」]をとってみる

$aaa = preg_replace(‘/▼▼(.*)$/’, ‘「□□」’, $aaa);

とすると

「●●」「★★」「「□□」

となる。

メタ文字について。
「 ^ 」…先頭から
「 $ 」…末尾から

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/php_k09.htm

これが思い違いしていた元凶のような感じ。

秀丸さんや各テキストエディタの正規表現をみると表現が違う。

「 ^ 」…行頭
「 $ 」…行末

これらをあわせて考えると・・・

$aaa = preg_replace(‘/▼▼$/’, ‘「□□」’, $aaa);

上記だと
「複数ある▼▼の最後にでてくる▼▼」でなく、
「行末の前が▼▼」を指定しているっぽい。
つまり「▼▼○[行末]」とかではなくて、「▼▼[行末]」のみ指定。

ってことは…preg_replaceを一回だけでやるのはダメじゃん。
「「▼▼」がいくつ含まれているかをチェックして、最後に表示される「▼▼」のみ置換え」っていう風にする必要がある。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい