2011-02-02 3 views
0

PHP Curl을 통해 ASP/VBScript 구성 파일을 가져 와서 일부 파일 처리를 수행하고 일부 값을 반환하려고합니다.다른 형식의 이름/값 쌍을 일치시키는 정규 표현식이 필요합니다.

문자열은 다음과 같이 :

config1 = "" 
config2 = "VALUE:1:0:9" 'strange value comment 
otherconfig = False 
yetanotherconfig = False 'some comment 

기본적으로 그 이름 값 쌍 임의로 따옴표 묶여 값이 동일 부호로 구분 코멘트 의해 임의로 하였다.

내가 실제 값을 반환 할

(거짓, VALUE : 1 : 9, 등 : 0) 여기에 내가 통과하고있어 패턴의 상관없이 문자열에있는 형식의 ONE 일치하는 그룹에

.

$pattern = '/\s*'.$configname.'\s*\=\s*(\".*?\"|.*?\r)/' 

$의 모두 configname 내가 찾고 있어요 특정 구성의 이름입니다, 그래서 변수를에 전달합니다 지금까지 preg_match를합니다.

나는 (값 자체 대신에) 값으로 괄호가 포함 된 것을 얻었고, 값을 반환하는 주석을 얻고있다.

도움을 주시면 감사하겠습니다.

+0

내가 당신의 설정 샘플에있는 괄호를 볼 수 없습니다. – BoltClock

+0

죄송합니다! 인용 부호..! – tresstylez

답변

1

큰 따옴표 대신 사용할 수있는 경우 ONE 일치 그룹에서 일치하는 값을 반환합니다. 역 참조는 다음을 도울 수 있습니다.

$pattern = '/\s*'.$configname.'\s*=\s*("?)(?<value>.*?)\1\s*[\'$]/' 

트릭을해야합니다. 그런 다음 $result['value']을 사용하십시오.

는 않습니다 영어로 설명 :

  • 내가
  • 이 일치 할 수 = 공간 (쉬운) 공간 식별자 공간을 건너 뛰 " \ 1 (첫 번째 캡처 괄호)
  • 일치하는 문자로 참조 탐욕 참조되지
  • value으로 일치 \ 1 (그래서 " 전에 하나, 또는 아무것도없는 경우가 있다면)
  • 일부의 일치 할 수 있습니다

    $pattern = '/\s*'.$configname.'\s*=\s*(?:"(.*?)"|(.*?)\s*[\'$])/' 
    

    보다 효율적인하지만 값 $result[1] 또는 $result[2]에 :

  • 은 주석 시작 ' 또는 다시 참조없이 라인

의 끝과 일치해야합니다 보.

실수를 이해 :

  • 당신은 문자열 따옴표 자체 (여기 간단한 견적을) 보호하거나 해석하는 레그로 예약 문자를 피하기 위해 \이 필요합니다 (같은 ., ^, $ ...) 라인의
  • 끝은 당신은 논평을 피할 수 없다
  • R 또는 \ n을하지 \, $로 표시되어
+0

'preg_quotes()'을 (를) 깜빡 했습니까? :-) – arnaud576875

+0

'$ configname'을 통해 견고성을 향상 시켰습니까? – Pierre

0

\ r은 CR 문자 (캐리지 리턴)와 일치합니다. 본질적으로 나는 "???????" 또는 ???????? [캐리지 리턴]

물론 아포스트로피를 얻을 수 있습니다. 이러한 것들을 제거해야합니다.

0

이 하나가 작동합니다 :

$pattern = '/ 
    \s* 
    # name 
    (?P<name>.*?) 
    # = 
    \s*=\s* 
    # value 
    (?P<val> 
     "(?P<quoted>([^"]|\\\\"|\\\\\\\\)*)" 
     |(?P<raw>.*?) 
    ) 
    # comment 
    \s*(?P<comment>\'.*)? 
$/xm'; 

이 입력 문자열의 모든 키 = 값 쌍을 일치합니다, 대신에 단지 특정 하나.

정규식은 따옴표로 묶인 값 (예 : "foo\"bar")에서 따옴표 및 이스케이프 된 따옴표 (\")를 처리합니다.

이 같은 기능을 사용

function parse_config($string) { 
    $pattern = '/ 
     \s* 
     # name 
     (?P<name>.*?) 
     # = 
     \s*=\s* 
     # value 
     (?P<val> 
      "(?P<quoted>([^"]|\\\\"|\\\\\\\\)*)" 
      |(?P<raw>.*?) 
     ) 
     # comment 
     \s*(?P<comment>\'.*)? 
    $/xm'; 

    preg_match_all($pattern, $string, $matches, PREG_SET_ORDER); 

    $config = array(); 
    foreach($matches as $match) { 
     $name = $match['name']; 
     if (!empty($match['quoted'])) { 
      $value = str_replace(array('\\"','\\\\'), array('"','\\'), $match['quoted']); 
     } else if (isset($match['raw'])) { 
      $value = $match['raw']; 
     } else { 
      $value = ''; 
     } 
     $config[$name] = $value; 
    } 

    return $config; 
} 

예 :

$string = "a = b\n 
c=\"d\\\"e\\\\fgh\" ' comment"; 

$config = parse_config($string); 

// output: 

array('a' => 'b', 'c' => 'd"e\fgh'); 

다른 예 :

$string = <<<EOF 
config1 = "" 
config2 = "VALUE:1:0:9" 'strange value comment 
otherconfig = False 
yetanotherconfig = False 'some comment 
EOF; 

print_r(parse_config($string)); 

// output: 

Array 
(
    [config1] => 
    [config2] => VALUE:1:0:9 
    [otherconfig] => False 
    [yetanotherconfig] => False 
) 
관련 문제