地味な思いつきのメモです。
eval() 使ったらスゲェ簡単なのに…とか思いながら、
その強力さゆえに、恐ろしくて使えない場合が、間々ある。
いつも奥の手として持ってるだけみたいな。
良くあるのは、
'こんにちは、{$foo}さん。ようこそ{$bar}のホメパゲへ。'みたいな文字列の中の変数に値を代入したいというやつ。
正規表現とかでやってたら回りくどいので、
何とか eval() を活用するためにセキュリティ対策を考えてみた。
ヒアドキュメント使うのがキモ。
あと、ちゃんと意識して引用符「'」「"」を使い分けて、
1 回しか評価しないように気を付ける。
ついでに、境界識別子 '$_boundary' を予測し難くすれば、悪い事もやりにくかろう。
PHP だと、こんな感じ。
<? function eval_vars_in_string($_string,$_vars) { extract($_vars); $_boundary = uniqid('__'); $_code = '$_return = <<<'.$_boundary.' '.$_string.' '.$_boundary.'; '; eval($_code); return $_return; } $_string = 'こんにちは、{$foo}さん。ようこそ{$bar}のホメパゲへ。'; $_out = eval_vars_in_string($_string,$_POST); ?>
という思い付きでした。[サンプル]
コメント歓迎。