文字列は次のとおりです。
$str="abcdefg foo() hijklmopqrst";
PHP に foo() を呼び出させ、返された文字列をこの文字列に挿入するにはどうすればよいですか?
文字列は次のとおりです。
$str="abcdefg foo() hijklmopqrst";
PHP に foo() を呼び出させ、返された文字列をこの文字列に挿入するにはどうすればよいですか?
何らかのクラスのメソッドを呼び出す場合は、通常の変数展開を使用できます。例えば:
<?php
class thingie {
public function sayHello() {
return "hello";
}
}
$t = new thingie();
echo "thingie says: {$t->sayHello()}";
これは出力されます:
ことわざ: こんにちは
呼び出しを囲む中括弧が必要であることに注意してください。
これを使用するだけです:
$str = "abcdefg".foo()."hijklmnopqrstuvwxyz";
文字列の作成中に関数を呼び出します。
$str="abcdefg foo() hijklmopqrst";
function foo() {return "bar";}
$replaced = preg_replace_callback("~([a-z]+)\(\)~",
function ($m){
return $m[1]();
}, $str);
出力:
$replaced == 'abcdefg bar hijklmopqrst';
これにより、関数名として小文字を使用できます。他の記号が必要な場合は、それらをパターンに追加します[a-zA-Z_]
。
呼び出しを許可する関数には十分注意してください。リモート コード インジェクション攻撃を許可しないように、少なくとも $m[1] にホワイトリストに登録された関数が含まれているかどうかを確認する必要があります。
$allowedFunctions = array("foo", "bar" /*, ...*/);
$replaced = preg_replace_callback("~([a-z]+)\(\)~",
function ($m) use ($allowedFunctions) {
if (!in_array($m[1], $allowedFunctions))
return $m[0]; // Don't replace and maybe add some errors.
return $m[1]();
}, $str);
"abcdefg foo() bat() hijklmopqrst"
出力でテスト実行します"abcdefg bar bat() hijklmopqrst"
。
ホワイトリスト アプローチの最適化 (許可された関数名から動的にパターンを構築する、つまり(foo|bar)
.
$allowedFunctions = array("foo", "bar");
$replaced = preg_replace_callback("~(".implode("|",$allowedFunctions).")\(\)~",
function ($m) {
return $m[1]();
}, $str);
$foo = foo();
$str = "abcdefg {$foo} hijklmopqrst";