preg_replaceのeオプション指定時のエスケープについて - PHPプロ!Q&A掲示板

813

  • 0P

preg_replaceのeオプション指定時のエスケープについて

質問日時 / 2007年12月7日 14:04    回答数 / 2件

Questioner:  bar51  このエントリーをはてなブックマークに追加 

キーワード / preg_replace    e    エスケープ   

はじめまして。

いろいろ検索してみたのですが良くわからなかったので質問させてください。

preg_replaceでeオプションを指定したときの後方参照文字列についてなのですが、
マニュアルによると
"(ダブルクォート)、'(シングルクォート)、\(バックスラッシュ)、NULL文字
がエスケープされるとあります。

しかし、手元の環境(PHP 5.2.3 WinXP)だとダブルクォートしかエスケープされない
ような感じなのです。
仕事で開発に使っているLinuxサーバ(PHP 5.2.0-8+etch7)でも同様でした。

この仕様(ダブルクォートしかエスケープされない)で確定ならそれに合わせてコード
を弄ればいいのですが、マニュアルの記述を読むとほんとにそれでいいのか不安に
なっています。

なお、実験的に書いたコードと実行結果(XPのDOS窓)は以下の通りです。

  1. <?php
  2. $str = $argv[1];
  3. print("$str\n");
  4. $str = preg_replace('/(.+)/e',"'\\1'",$str);
  5. print("$str\n");
  6. ?>
  7.  
  8. X:\test>c:\PHP\php preg_test.php ab\"c'def\g
  9. ab"c'def\g
  10. ab\"c'def\g

よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01kaitauこんにちは。 NULLのケースがどうなったかわかりま
 ┗A01-1bar51お返事ありがとうございます。 大変参考になりました

回答一覧

並び替え:

A01 満足
answererkaitau [12月7日 16:16]

こんにちは。

NULLのケースがどうなったかわかりませんが、上のサンプルに関しては、
おそらく、ちょっとした勘違いだと思います。
ちょっと手を加えてみました。

  1. <?php
  2.   $str = $argv[1];
  3.   print("$str\n");
  4.   $aft1 = preg_replace('/(.+)/e',"'\\1'",$str);
  5.   $aft2 = preg_replace('/(.+)/e','"\\1"',$str);
  6.   print("1: $aft1\n");
  7.   print("2: $aft2\n");
  8. ?>

  1. ab"c'def\g
  2. 1: ab\"c'def\g
  3. 2: ab"c\'def\g

つまり、e修飾子の効果として、 「PHP コードとして評価し」文字列として解釈する際に、
質問のケースだと
「''で括っている中身を『 ab\"c\'def\g 』と表現している」ので、
文字列の値としては
ab\"c'def\g
になっているのだと思います。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerbar51 [12月8日 00:23]

お返事ありがとうございます。
大変参考になりました。

元々C等コンパイル言語をメインでやってきたので、「コードとして評価」ということがちゃんと理解できていなかったようです。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)