[PHP-users 20465]Re: 再帰(?)正規表現置換について

UNO Shintaro uno @ venus.dti.ne.jp
2004年 2月 19日 (木) 18:51:06 JST


> > 確かに、この場面においては、不便なbehaviourですね。
> > 理屈はわかるし、回避できなくもないので、まあしょうがないかという感じ。
> 
> 私は理屈がわかりません。
> 
> 宇野さんにはお分かりとのことなので、教えていただけるとうれしいのですが、

えーと、理屈(現在の動作の“正当性”の根拠という意味ではなくて、
いま/e修飾子で“どういう処理が行われているのか”の説明という意味)は、
steven -a-t- acko dot net氏も書いておられるとおり、

「マッチした文字列にaddslashesと同等の処理を行った上で、
\1,\2などの位置に埋め込み、それからevaluateする」

という動作なのだということです。
下記のテスト結果で、最後にワザと文法エラーを起こさせてるのですが、
そこで出てくるevaluating codeを見るとはっきり分かります。

PHPの文字列リテラル表現で、'〜'の中では\'と\\だけがアンエスケープされ、
それ以外の場合には\が単独で存在できる、というのは確立した仕様なので、
\"が\"のままになってしまうのは、まあしょうがないか、と思っています。


> 逆に、'' の中では、' 自身を使う方法がありませんから、先の対症療法にも自
> ずと限界があると思います。

''の中では \'と書くことで'自身を使えますよ。


>マニュアル本体にあってしかるべき

同感です。


テストコード
-------------------------------------
<?php
        $x = 'XYZ';
        $string = "abcd'efgh\"ijkl\\\$x";

        print($string);
        echo "\n";

        print(preg_replace('/(.*)/',"\\1",      $string));
        echo "\n";
        print(preg_replace('/(.*)/','\1',       $string));
        echo "\n";

        print(preg_replace('/(.*)/e',"'\\1'",   $string));
        echo "\n";
        print(preg_replace('/(.*)/e','\'\1\'',  $string));
        echo "\n";
        preg_replace('/(.*)/e','print(\'\1\')', $string);
        echo "\n";

        print(preg_replace('/(.*)/e',"\"\\1\"", $string));
        echo "\n";
        print(preg_replace('/(.*)/e','"\1"',    $string));
        echo "\n";
        preg_replace('/(.*)/e','print("\1")',   $string);
        echo "\n";

        print(preg_replace('/(.*)/e','\1',      $string));
        echo "\n";
//      preg_replace('/(.*)/e','print(\1)',     $string);
//      echo "\n";
?>

-------------------------------------

結果
-------------------------------------
abcd'efgh"ijkl\$x
abcd'efgh"ijkl\$x
abcd'efgh"ijkl\$x
abcd'efgh\"ijkl\$x
abcd'efgh\"ijkl\$x
abcd'efgh\"ijkl\$x
abcd\'efgh"ijkl\XYZ
abcd\'efgh"ijkl\XYZ
abcd\'efgh"ijkl\XYZ
PHP Warning:  Unexpected character in input:  '\' (ASCII=92) state=1 in /home/uno/test.php(27) : regexp code on line 1

Warning: Unexpected character in input:  '\' (ASCII=92) state=1 in /home/uno/test.php(27) : regexp code on line 1
PHP Parse error:  parse error in /home/uno/test.php(27) : regexp code on line 1

Parse error: parse error in /home/uno/test.php(27) : regexp code on line 1
PHP Fatal error:  Failed evaluating code:
abcd\'efgh\"ijkl\\$x in /home/uno/test.php on line 27

Fatal error: Failed evaluating code:
abcd\'efgh\"ijkl\\$x in /home/uno/test.php on line 27
-------------------------------------

-- 
UNO Shintaro, 宇野 信太郎
mailto:uno @ venus.dti.ne.jp
http://www.venus.dti.ne.jp/~uno/



PHP-users メーリングリストの案内