如何從字串代碼中提取方法名稱和引數?
例子 :
$obj->MethodA($obj->MethodB(param1,$obj->MethodX()))
我嘗試使用這個正則運算式但不起作用
preg_match_all('/\$obj->(\w )\(((\w|,| )*)\)/', $string, $matches)
目的是提取所有方法呼叫及其引數,因此匹配項應該匹配
$obj->MethodA($obj->MethodB(param1, $obj->MethodX()))
$obj->MethodB(param1,$obj->MethodX())
$obj->MethodX()
有些人可能會說使用正則運算式并不理想。有沒有其他選擇?
uj5u.com熱心網友回復:
我建議使用能理解 PHP 語法的東西。例如這個庫 - https://github.com/nikic/PHP-Parser
正則運算式可能會很快變得笨拙。
使用提到的 PHP-Parser 的快速示例。
use PhpParser\Node\Expr\CallLike;
use PhpParser\NodeFinder;
use PhpParser\ParserFactory;
use PhpParser\PrettyPrinter\Standard;
$php = '<?php $obj->MethodA($obj->MethodB("test",$obj->MethodX()));';
$parserFactory = new ParserFactory();
$parser = $parserFactory->create(ParserFactory::PREFER_PHP7);
$statements = $parser->parse($php);
$finder = new NodeFinder();
// Or if you only want method calls, we could also find instances of MethodCall
$calls = $finder->findInstanceOf($statements, CallLike::class);
$printer = new Standard();
foreach ($calls as $call) {
echo $printer->prettyPrintExpr($call) , "\n";
}
// Output
//$obj->MethodA($obj->MethodB("test", $obj->MethodX()))
//$obj->MethodB("test", $obj->MethodX())
//$obj->MethodX()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/416614.html
標籤:
下一篇:如何在php中決議這些檔案模式?
