プロが教える店舗&オフィスのセキュリティ対策術

preg_matchとereg_matchの動作について調べています。

下記のスクリプトを実行すると、$stringが「代入テスト」となります。
-------------------------------------------
$v_insert = "代入"
$string = "{%v_insert}テスト";

while (preg_match("/\{%(.*)\}/U", $string, $match)){
$string = ereg_replace($match[0], $$match[1], $a_subject);
}
-------------------------------------------
$$match[1]→$($match[1])→$(v_insert)となり、

$match[0]→/\{%(.*)\}/U
$match[1]→v_insert
$$match[1]→代入
となるのは分かったんですが、なぜ、$match[0]→/\{%(.*)\}/Uで$match[1]がv_insertになるのかが分かりません。

このスクリプトはどのように動き、どのように変数に値が設定されているのでしょうか。

A 回答 (2件)

preg_match の3番目の引数は検索結果が配列となって代入されることになっています。



その配列の0番目はパターン全体にマッチしたテキストが入るはずなので実際は {%v_insert} が入ってるのではないでしょうか。(私の手元の環境ではそうなりました)

配列の1番以降はサブパターンにマッチしたテキストが入るので、パターンの中の ( ) で囲まれた部分が入ります。
書かれているパターンの中には ( ) が一組しかないので、その部分にマッチしたテキストが $match[1] に入ります。

参考URL:http://www.php.net/manual/ja/function.preg-match …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

$match[0]は{%v_insert}だったんですね。
こっちの環境でprint_rしても、何も出てこなかったので・・・。

$v_insert→代入なので、$$match[1]→代入となるためには$match[1]がv_insertにならないといけないですよね。つまり、(.*)がv_insertってことですね。

お礼日時:2009/03/14 21:19

> つまり、(.*)がv_insertってことですね。



そうですね、/\{%(.*)\}/ という正規表現で "{%v_insert}テスト" をマッチさせると (.*) の部分は v_insert にマッチします。
    • good
    • 0
この回答へのお礼

いろいろありがとうございます。
(括弧)の中のパターンがサブパターンだと知って、ますます理解が深まりました。

もやもやが晴れました!

お礼日時:2009/03/14 23:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!