2013-01-21 2 views
3

특수 함수 호출을 위해 PHP 파일을 검색하고 싶습니다. 그 이유는 GetText-Extension 용 .MO-Files를 생성하려고하기 때문입니다. 그래서 나는 먼저 필요한 모든 텍스트 문자열을 포함하는 .PO-Files를 생성해야합니다.함수 호출의 첫 번째 인수 문자열 가져 오기

이미 많은 텍스트가 있지만 문제가 있습니다.

/\_\([\'|\"]{1}(.+?[^\\\])[\'|\"]{1}[,]{0,1}.*?\)+/si 

나는 다음과 같은 패턴과 함수 호출을 찾을 필요가 :

_("text"); 
_("text %s", 3); 
_('text'); 

텍스트가 탈출 따옴표를 포함 할 수

은 여기 functioncall의 첫 번째 인수를 찾을 수 내 정규식입니다. 내 문제는 아포스트로피 또는 통화에 사용 된 정상적인 견적이 있었는지, 내가 알아야 할 acuallty입니다.

내가 전화를

_('"text"'); 

이있는 경우 다음 나는 끝 따옴표없이 텍스트

"text 

를 얻을, 문제를 얻는다.

아무도 아이디어가 없으면 어떻게 정규식을 사용할 수 있습니까?

+0

당신이 문자열을 수집하기 위해 각각 xgettext 프로그램을 사용하지 않는 특별한 이유? – hank

+0

정규식이 유효하지 않은 것 같습니다. – nhahtdh

+0

이미 템플릿 용 텍스트가있는 DB가 있습니다. Theres는 또한 텍스트를 번역하는 도구입니다.그게 내가이 도구와 PHP- 텍스트로 모두 끝내고 싶은 이유입니다. 실제로 제대로 작동하지만 '텍스트'문자열에만 문제가있었습니다. 개선 할 점이나 유효하지 않은 점은 무엇입니까? :) –

답변

4

나는 PHP의 tokenizer 물건의 종류가 아닌 정규 표현식을 사용합니다 :

$funcName = '_'; 
$tokens = token_get_all(file_get_contents('path/to/your/script.php')); 
$strings = array(); 

foreach($tokens as $index => $token){ 

    if(!is_array($token)) 
    continue; 

    if($token[0] === T_CONSTANT_ENCAPSED_STRING){ 

    if(!isset($tokens[$index - 2]) || ($tokens[$index - 1] !== "(")) 
     continue; 

    list($id, $text, $line) = $tokens[$index - 2]; 

    // this is your string (substr drops quotes around it) 
    if(($id === T_STRING) && ($text === $funcName)) 
     $strings[] = substr($token[1], 1, -1); 

    }  
} 

var_dump($strings); 
+0

+1 깨끗한 솔루션을 원하지만 문자열 대신 함수 이름으로 시작하지 않는 것이 궁금합니다 – nhahtdh

+0

이유가 없습니다. 내 선택. –

2

원시 정규 표현식 :

_\((?|'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)") 

구분 정규식 :

~_\((?|'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)")~ 

기 1. 포착 I는 캡처 그룹 번호가 각 교대 리셋되도록 분기 리셋 패턴 (?|pattern)을 사용하는 결과 지점은 |으로 구분됩니다.

  • '((?:[^'\\]|\\.)*)' : 일치 및 비 인용 비 - 백 슬래시 또는 탈출 순서 중 하나를 구성 단일 인용 문자열, 내부 캡처 컨텐츠 분기의 내부

    (?|'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)") 2 패턴입니다 재설정합니다. 사실, (원시) 개행 문자가 문자열의 일부로 간주되기 때문에 여기서 약간 부주의합니다. 나는 사양이 이것을 허용 할 것이라고 생각하지 않지만, 입력에 유효한 코드가 들어 있으면 문제가 없어야한다.

  • "((?:[^"\\]|\\.)*)" : 위와 동일하지만 큰 따옴표가 붙은 문자열의 경우.

나는 함수에 대한 나머지 인수를 사용하지 않는다는 점에 유의하십시오.

+0

실제로 잘 작동하지만, 문자열 "hallo 텍스트"이 (가) \ –

+0

뒤에 분할됩니다. KevinGlier : Fixed. – nhahtdh

+0

이제 완벽하게 작동하는 것 같습니다. 하지만 "컴파일이 실패했습니다 : 문자 클래스가 51 번에서 오프셋되었습니다."라는 오류가 발생하여 백 슬래시를 더 추가했습니다. preg_match_all ('~ _ \ ((? | \'(? : [^ \ '\\\] | \\.) *) \'| "((? : [^"\\ \).) *) ") ~ ', ...); –

관련 문제