使用preg_match_all从php文件中获取函数名称

时间:2016-07-27 13:30:39

标签: php

我有一个文件 test.php

public function editAction() {
   //...
}  

public function editGroupAction() {
   //...
} 

这是我的代码:

$source = "test.php";
$fh = fopen($source,'r');
while ($line = fgets($fh)) {
   preg_match_all('/function(.*?)Action()/', $line, $matches);
   var_dump($matches);
} 

我希望得到以Action结尾的函数,但结果为空。我如何得到这样的结果:

edit
editGroup

2 个答案:

答案 0 :(得分:2)

您的代码可以简化为:

$fileName = 'test.php';
$fileContent = file_get_contents($fileName);
preg_match_all('/function(.*?)Action()/', $fileContent, $matches);
$functions = $matches[1];

结果($functions):

Array
(
    [0] =>  edit
    [1] =>  editGroup
)

<小时/> <小时/>

以下是您的代码,但有一些更改......

首先,检查是否找到了任何内容,如果是,请将其添加到数组中。这是工作代码:

$source = "test.php";
$fh = fopen($source,'r');
$m = array();
while ($line = fgets($fh)) {
    if(preg_match_all('/function(.*?)Action()/', $line, $matches)){
        $m[] = $matches[1][0];
    }
}

结果($m):

Array
(
    [0] =>  edit
    [1] =>  editGroup
)

由于preg_match_all 返回完整模式匹配的数量,您可以使用return来检查是否找到了任何内容。如果您获得了匹配,请将所需值添加到数组中,以便稍后获取。

你得到一些空的结果,因为并非所有的行都匹配;)

旁注:如上所述,您最终会得到类似string(5) " edit"的内容(请注意空格)。我不知道preg,所以我无法为你修复它。我能做的是建议你改为$functions = array_map('trim', $matches[1]);

答案 1 :(得分:0)

不确定这是否是您想要的,但您应该在regexp中转义括号。

所以这里是您的代码,稍作修改:

<?php
$content = "public function editAction() public function editGroupAction()";
preg_match_all('/function(.*?)Action\(\)/', $content, $matches);
echo '<pre>';
var_dump($matches);
echo '</pre>';

?>

是的,结果不是空的:)