2010-08-04 3 views
0

정규 표현식과 PHP 클래스 :일치 내가 파일에서 PHP는 클래스를 잡을 싶어

class a { 
    function test() { } 
} 

class b extends a { 
    function test() { } 
} 

및 결과 일치해야합니다

class a { 
    function test() { } 
} 

class b extends a { 
    function test() { } 
} 
+1

다음을 고려하십시오 :'/ * 클래스 없음 {} */클래스 C {}'및/또는'클래스 D {$ a = "클래스 없음 {}}"; }'. 즉, 이것은 정규 표현식을 사용하여 가능하지 않습니다. 파서가 필요합니다. –

+0

@ 바트 : 이것은 정규식으로 할 수 있습니다. 그러나 그것이 어떻게되어야하는지 상상할 수 없다면, 시도하지 마세요. – jmz

+0

@jmz, 다음 방법을 보여주세요. –

답변

5

프로그래밍 언어의 문법을 파싱 할 때 regexps가 잘못되었습니다. 대신 tokenizer 함수를 고려하십시오. 예 : http://php.net/manual/en/function.token-get-all.php 도 참조하십시오. http://framework.zend.com/apidoc/core/Zend_Reflection/Zend_Reflection_File.html

+0

@Wiliam,'token_get_all ($ source)'의 예제는 다음에서 찾을 수 있습니다 : http://stackoverflow.com/questions/2217839/regex-removing-methods-from-code –

+0

@Bart K. C# app을 사용하여 클래스를 개별 파일로 분리 할 수 ​​있습니다. 이것은 좋은 반응이지만, 제가 찾고있는 것은 아닙니다. 마지막 정규 표현식은 저에게 답을 주면서 여기에 올렸지 만 여러분의 응답을 좋은 것으로 표시 할 것입니다, 감사합니다. – Wiliam

+0

@Wiliam, 내 대답은 아니지만 'stereofrog'입니다. –

-1

다음을 Regex 지금 당장 일했다 :

^(?:(public|protected|private|abstract)\s+)?class\s+([a-z0-9_]+)(?:\s+extends\s+([a-z0-9_]+))?(?:\s+implements\s+([a-z0-9_]+))?.+?{.+?^} 

요구 :

case insensitive | ^$ match at line breaks | dot matches new lines 

이 유일한 작품 "클래스"마지막은 "}"들여 쓰기를하지 않은 경우.

+1

'. +?'는 내부에'}'이있는 문자열이나 주석이 있으면 실패합니다. 마지막으로 욕심스럽게 만들거나'\ s * $'와 같은 것을 정규 표현식 끝에 추가하십시오. –

+0

이것은 실제로 올바르지 않습니다. 예를 들어 둘 이상의 인터페이스를 구현하는 최종 클래스 및 클래스를 캡처하지 못하는 경우입니다. – Andrey

0

단일 정규식은이 작업을 수행하지 않습니다. PHP는 regex보다 더 복잡한 언어입니다 (문맥 자유 문법과 규칙적인 문법에 관한 내용을 여기에 삽입하십시오). 정규식이 더 쉽게 일치하도록 소스 코드를 변경하지 않는 한 시도하는 것이 좋습니다.

1

사용 token_get_all는 PHP 코드의 language tokens의 배열을 얻을 수 있습니다. 그런 다음 반복하여 T_CLASS 값을 가진 토큰을 찾으십시오.이 키워드는 class 키워드를 나타냅니다 (추상 클래스 또는 가시성을 고려하지 않음). 다음 T_STRING 토큰은 클래스의 이름입니다. 그런 다음 값이 { 인 다음 일반 토큰을 찾고 블록 깊이에 대한 카운터를 늘리고 대괄호 (예 : 카운터가 0)와 같은 양의 닫는 중괄호를 방문 할 때까지 모든 일반 } 토큰으로 줄입니다. 그런 다음 전체 클래스 선언을 진행했습니다.

관련 문제