0

我正在编写一个脚本(在 PHP 中),它将通过一个 PHP 文件,找到一个函数的所有实例,用另一个名称替换函数名,并操作参数。我正在使用get_file_contents()thenstrpos()来查找函数的位置,但是一旦我知道函数开始的位置,我正试图找到一种提取参数的好方法。现在我只是使用循环遍历文件字符串中的下一个字符并计算左括号和右括号的数量。一旦它关闭函数参数,它就会退出并传回参数字符串。不幸的是,用括号括起来的引号(即 )会遇到麻烦function_name(')', 3)。我也可以只计算引号,但是我必须处理转义引号、不同类型的引号等。

有没有一种好方法,知道函数的开始,可靠地获取参数字符串?非常感谢!

4

2 回答 2

0

编辑: 如果我没有仔细阅读问题,如果你只想获取函数参数,你可以看到这些例子:

$content_file = 'function func_name($param_1=\'\',$param_2=\'\'){';
preg_match('/function func_name\((.*)\{/',$content_file,$match_case);
print_r($match_case);

但如果您想操作该功能,请阅读下文。


这些怎么样 :

  1. 使用读取文件file_get_contents();
  2. 用于preg_match_all();获取该文件中的所有功能。
  3. 请不要让我/*[new_function]*/在该文件中写入以识别 EOF。

我使用它来动态添加/删除功能,而不必打开该 php 文件。

实际上,它应该是这样的:

//I use codeigniter read_file(); function to read the file.
//$content_file = read_file('path_to/some_php_file.php');
//i dont know whether these line below will work.
$content_file = file_get_content('path_to/some_php_file.php');
//get all function inside php file.
preg_match_all('/function (.*)\(/',$content_file,$match_case);
//
//function name u want to get
$search_f_name = 'some_function_name';
//
for($i=0;$i<count($match_case[1]);$i++){ 
    if(trim($match_case[1][$i]) == $search_f_name){ 
        break;
    } 
}
//get end position by using next function start position
if($i!=count($match_case[1])-1){
    $next_function= $match_case[1][$i+1];
    $get_end_pos = strripos($content_file,'function '.$next_function);
} else {
    //Please not that i write /*[new_function]*/ at the end of my php file 
    //before php closing tag ( ?> ) to identify EOF. 
    $get_end_pos = strripos($content_file,'/*[new_function]*/');
}
//get start position
$get_pos = strripos($content_file,'function '.$search_f_name);
//get function string
$func_string = substr($content_file,$get_pos,$get_end_pos-$get_pos);

您可以echo $func_string;知道这些代码是否运行良好。

于 2013-03-31T23:02:43.047 回答
0

使用真正的解析器,像这样:

https://github.com/nikic/PHP-Parser

使用此库,您可以将源代码作为“节点”对象树而不是字符串来操作,然后将其写回。

于 2013-03-31T23:31:43.717 回答