2012-06-10 3 views
0

가능한 중복이 들어PHP, 정규식 새로운 라인

function foo(){ 
     ...code { code{} } code... 
} 

:
A PHP regex to extract php functions from code files

나는 이런 식으로 뭔가를 포맷 기능의 목록이있는 파일이 특정 파일 나는 항상 'function'이라는 단어를 왼쪽으로 끝까지 넣을 것이고 끝나는 중괄호는 t까지 올릴 것입니다. 그는 떠났다. 일반적으로 함수 내의 코드는 항상 들여 쓰기됩니다. 함수 내의 코드에는 중괄호를 포함한 문자가 포함될 수 있습니다.

함수의 이름이 키인 연관 배열을 얻기 위해 PHP로 파일을 구문 분석하고 싶습니다.

$regex = "/function.*/"; 
preg_match_all($regex, $str, $result, PREG_PATTERN_ORDER); 
$arr = $result[0]; 

print_r($arr); 

이 다음과 같은 생산하고 각각의 새로운 라인에서 정지 :

$regex = "/function.*\n}$/s"; 
:

Array 
(
    [0] => function foo(){ 
    [1] => function bar(){ 
    [2] => function stop(){ 
    [3] => function go(){ 
) 

내가 정규식에 변경 시도 난 그냥이 시작, 여기 아주 간단한 시작이다

내 생각에 말풍선 중괄호 뒤에 직접 개행 문자가있는 경우 \n}$은 기능의 끝과 일치합니다. 그러나 이것은 작동하지 않습니다. 이후에 모든 것을 포함하는 하나의 긴 요소가있는 배열을 생성합니다. function foo()

연관 배열의 키에 함수 이름을 가져 오지 못했습니다.

답변

1

@ 존 R

이 정규식 솔루션입니다 : 내가 솔루션을 연구합니다

$regex = '~ 
    function     #function keyword 
    \s+      #any number of whitespaces 
    (?P<function_name>.*?) #function name itself 
    \s*      #optional white spaces 
    (?P<parameters>\(.*?\)) #function parameters 
    \s*      #optional white spaces 
    (?P<body>\{.*?\})  #body of a function 
~six'; 

if (preg_match_all($regex, $input, $matches)) { 
    print_r($matches); 
} 
0

이 같은 표현은 귀하의 경우 충분한 수 :

/^function\s++(\w++).*?^}/ms 

그것은 들여 쓰기되지 않은 첫번째 }에서 경기를 중지합니다. 함수 이름은 첫 번째 캡처 그룹에 있고 전체 일치가 함수입니다.

+0

,하지만 난 $ 정규식으로 변경하여 빈 배열을 얻고 = "/^기능 \ B 형 \ S + (\ w ++). *? $}/ms "; –

+0

@Qtax : [중복 질문 대신]에 답을 추가하십시오. (http://stackoverflow.com/questions/2488498/a-php-regex-to-extract-php-functions-from-code-files) . – hakre

+0

@hakre, 같은 질문이 아니기 때문에 할 수 없습니다. 이 질문에서 들여 쓰기가 지정되어 있으며 (이와 같은 간단한 표현이 가능합니다.) 다른 질문에는 없습니다. – Qtax