从字符串中提取方法调用
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()
如何从字符串代码中提取方法名和参数?
示例:
$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()