从字符串中提取方法调用

Extract method call from string

如何从字符串代码中提取方法名和参数?

示例:

$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()

有些人可能会说使用正则表达式并不理想。还有其他选择吗?

我建议使用能够理解 PHP 语法的东西。例如这个图书馆 - https://github.com/nikic/PHP-Parser

正则表达式可能很快就会变得笨拙。

使用提到的PHP-解析器的快速示例。

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()