2012-06-30 4 views
-3

Я пытаюсь разобрать функцию в php на 3 вещи: имя, аргументы и содержимое.Parsing php-функции с регулярным выражением

У меня есть регулярное выражение, которое делает это хорошо, но проблема в том, что он может анализировать только одну функцию. i.e - если я написал функцию, которую он может проанализировать, но если я напишу функцию и print_r, он будет замешан.

Регулярное выражение это:

preg_match("/function.+?([a-zA-Z0-9_]+?)[\s]*\((.*?)\)[\s]*\{(.+)\}/is", $code, $functions); 

я не написал, кто-то помог мне потому что я буду сосать в регулярном выражении. Спасибо за помощь.

С уважением, Roy.

+0

Помогает ли 'preg_match_all'? (http://php.net/manual/en/function.preg-match-all.php) –

+0

Итак, у вас нет вопросов, и вы, видимо, ожидаете, что кто-то просто сделает вашу работу за вас? Это не так, как работает SO. – lanzz

+4

Похоже на другое «Должен использовать регулярное выражение для всего». Попробуйте http://php.net/book.tokenizer – KingCrunch

ответ

1

Я не уверен, что понимаю вашу проблему, но похоже, что ваше регулярное выражение не будет анализировать несколько функций из переменной $ code?

Вот немного переписан регулярное выражение, которое может работать с несколькими функциями

$code = 'function myfunc1() { echo "This is myfunc1"; } function myfunc2($arg1 = array(), $arg2) { echo "This is myfunc2"; print_r($arg1); }'; 

preg_match_all("/function\s*([a-zA-Z0-9_]+)\s*\((.*)\)\s*\{(.*)\}/Uis", $code, $functions); 

echo '<pre>'; 
print_r($functions); 
echo '</pre>'; 

И выход

Array 
(
    [0] => Array 
     (
      [0] => function myfunc1() { echo "This is myfunc1"; } 
      [1] => function myfunc2($arg1 = array(), $arg2) { echo "This is myfunc2"; print_r($arg1); } 
     ) 

    [1] => Array 
     (
      [0] => myfunc1 
      [1] => myfunc2 
     ) 

    [2] => Array 
     (
      [0] => 
      [1] => $arg1 = array(), $arg2 
     ) 

    [3] => Array 
     (
      [0] => echo "This is myfunc1"; 
      [1] => echo "This is myfunc2"; print_r($arg1); 
     ) 

) 

Это будет, однако, столкнулись с проблемами, если ваши функции тела содержат {} символов. Я не думаю, что это может быть обработано одним регулярным выражением.

+0

Вопрос: как в первом регулярном выражении он мог обрабатывать {} charecters внутри функций? за исключением того, что это gr8. –

+0

Поскольку первое регулярное выражение захватывало все до последнего появления} во входной строке, которая включала любые {} между ними. С несколькими функциями он будет делать точно то же самое, соответствует всем до финала}, который будет соответствовать нескольким функциям как одно совпадение. – MaggoT

+0

как это можно сделать с двумя регулярными выражениями? –

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