2013-03-31 3 views
0

Я пишу скрипт (в PHP), который будет проходить через PHP-файл, найти все экземпляры функции, заменить имя функции другим именем и манипулировать параметрами. Я использую get_file_contents(), затем strpos(), чтобы найти позиции функции, но я пытаюсь найти хороший способ извлечь параметры, как только я узнаю позицию начала функции. Прямо сейчас я просто использую цикл, который просматривает следующие символы в строке файла и подсчитывает количество открывающих и закрывающих круглых скобок. Как только он закрывает параметры функции, он завершает работу и передает строку параметров. К сожалению, возникают проблемы с котировками, заключенными в круглые скобки (то есть function_name(')', 3)). Я мог бы просто пересчитать котировки, но тогда мне приходится иметь дело с беглыми цитатами, разными типами котировок и т. Д.PHP - скрипт для управления/замены параметров функции в файле PHP?

Есть ли хороший способ, зная начало функции, надежно захватить строку параметров? Спасибо много!

+1

Возможно, вы ищете _tokenizer_ – kero

+0

https://github.com/nikic/tokenstream –

+0

@kingkero: Спасибо за быстрый ответ. Как я могу использовать токенизатор для этого? – golmschenk

ответ

0

EDIT: В случае я так внимательно не читал этот вопрос, если вы хотите получить только параметры функции, вы можете увидеть этот пример:

$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; знать, работает ли это код хорошо или нет.

0

Используй реальный анализатор, как этот:

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

Используя эту библиотеку, вы можете работать с исходным кодом в виде дерева «узел» объекты, а не как строка, и записать его обратно.

 Смежные вопросы

  • Нет связанных вопросов^_^