[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 メーリングリストの案内