2012-01-29 3 views
3

지금은 PHP 소스 코드 파일에서 특정 함수를 찾기 위해 PHP의 토크 나이저를 사용하는 스크립트가 있습니다. 나는 현재를 찾고 있어요 패턴은 다음과 같습니다PHP 토크 나이저로 함수 찾기

T_STRING + T_WHITESPACE (옵션) + "("이것은 내가의 목적을 위해 무시하고 변수 기능을 제외하고 지금까지 내 테스트 케이스의 모든 일치하는 것으로 보인다

.이 질문에 여기

명백한 문제는이 패턴이 일치하는 함수 정의처럼, 오 탐지를 많이 생산하고 있습니다 :

public function foo() { // foo() should not be matched 

내 질문은, 는 모르겠지만를위한 안정된/정확한 방법이있다 소스 코드에서 oking하고 모든 함수 호출을 뽑아 낼 수 있습니까? 토크 나이저를 사용하는 것보다 더 좋은 방법일까요?

편집 : 특히

, 내가 클래스 파일 내 disable_functions PHP 지시어 의 기능을 에뮬레이션 할 찾고 있어요. 따라서 exec()을 허용하지 않으면 분석 된 파일 내에서 해당 기능을 사용하려고합니다. 나는 가변 함수가 이것을 매우 어렵게 만든다는 것을 알기 때문에 이것들을 감지하고 그것들을 허용하지 않는다.

+1

만약 당신이 그들을 찾고 있다면, 당신은 미리 모든 T_WHITESPACE와 T_COMMENT 섹션을 벗겨서 조금 단순화시킬 수 있습니다. 그런 다음 앞의 토큰이 T_FUNCTION/메소드 선언이 아니라고 주장하는 것이 더 쉬워집니다. '$ func();'과 다른 호출은 여전히 ​​빠져있을 것이다. – mario

+0

@mario : 주석/공백 제거 제안을 주셔서 감사합니다. 실제로 도움이 될 것입니다. – FtDRbwLXw6

답변

0

먼저 토크 나이저 (PHP에서 사용 가능)를 실행하십시오. 그런 다음 토큰 위에 구문 분석기를 실행합니다. 파서는 토큰을 읽어야하고 특정 토큰이 사용 된 것을 말할 수 있어야합니다. 파서의 신뢰성에 따라 결과가 얼마나 신뢰할 수 있는지에 달려 있습니다.

현재 파서 (코드를 표시하지 않았 음)가 충분히 신뢰할 수 없다면 더 나은 파서를 작성해야합니다. 간단합니다. 아마도 토큰 화보다 더 많은 일을하지 않을 것입니다.

+0

나는 토크 나이저를 사용 중이며 OP에서 언급 된 토큰 패턴을 찾고 있습니다. 나는 현재 파서를 사용하지 않는다. – FtDRbwLXw6

+0

토큰은 매우 제한적입니다. Mario는 토큰에 대해 거친 파서를 작성하는 방법에 대한 의견을 제시하면서 몇 가지 제안을했습니다. 그러나 당신이 무엇을하든 PHP 토큰 화 도구를 사용하는 파서를 만들 것입니다. 특정하게 당신이 찾고있는 것 (함수가 호출 된 장소)에 대한 질문에 더 많은 정보를 추가 할 수 있다면 이전에 비슷한 것을했기 때문에 다른 사람들이 귀하의 질문에 대답하도록 이끌 것입니다. 또한 [PHP QA 도구] (http://phpqatools.org/), 특히 정적 코드 분석과 관련된 방법을 살펴보십시오. – hakre

+0

나는 나의 질문을 조금 분명히했다. 링크를 가져 주셔서 감사합니다. – FtDRbwLXw6

0

대신 토큰 라이저를 사용하는 대신 높은 수준의 파서를 사용하여 코드를 분석하십시오. 예를 들어, PHP-Parser은 함수 선언뿐만 아니라 함수 호출을 명시 적으로 식별 할 수 있습니다.