0

私はこの文字列を持っています

$s = 'Yo be [diggin = array("fruit"=> "apple")] scriptzors!';

その後、によってチェックされます

$matches = null;
preg_match_all('/\[(.*?)\]/', $s, $matches);
var_dump($matches[1]);

しかし、私がそれをしたいのは次のことです、それは次を返すはずです

print "yo be";
$this->diggin(SEND ARRAY HERE);
print "scriptzors!";

以下の回答で問題を表示するために編集

$s = 'Yo be [diggin = array("fruit"=>"apple")] scriptzors!';
$matches = null; 
preg_match_all('/\[(.*?)\]/', $s, $matches);

$var = explode(' = ', $matches[1]);
print $var[0]; //THIS DOES NOT PRINT
4

2 に答える 2

0

あなたはちょっと近いです。explodeで文字列を作成できますが、の=前後にスペースを含めることができます=。この場合、最初の要素は関数名になり、この場合diggin、2番目の要素は配列になりますが文字列になります。eval適切な配列データ型になるように、これを行う必要があります。

$var = explode(' = ', $matches[1][0]);
call_user_func_array(array($this, $var[0]), eval($var[1] . ';'));
// or do 
$this->{var[0]}(eval($val[1] . ';'));

別の方法として、を呼び出す必要がないように正規表現を変更することもできますexplode

preg_match_all('/\[([a-z0-9_]*)\s*?=\s*(.*)\]/i', $s, $matches);

いずれにせよ、ユーザー入力をサニタイズすることを確認する必要がありevalます。

于 2012-09-23T09:41:17.673 に答える
0

これにより、evalを使用せずに関数が呼び出され、コードインジェクションにさらされることはありません。

preg_match_all('/\[([a-z0-9_]*)\s*?=\s*array\((.*)*\)\]/i', $s, $matches);
$var = explode(',', $matches[2][0]);
$result = array();
foreach ($var as $value) {
    $keyvaluepair = explode('=>', $value);
    $result[$keyvaluepair[0]] = $keyvaluepair[1];
}
$this->{var[0]}($result);
于 2013-04-10T12:08:10.493 に答える