PHP는

2016-07-25 8 views
0

그래서 난 등 내가 데이터를 처리하는 PHP 이러한 CFG 파일을 구문 분석 할PHP는

, 서비스, 호스트, 연락처, Nagios의 CFG 파일의 몇 가지있다 텍스트 패턴 (CFG 파일)에서 배열을 확인합니다.

ContactGroups.CFG

define contactgroup { 
    contactgroup_name  VAP3 
    alias     VAP3_PRE 
    members     userz, userw } 

define contactgroup { 
    contactgroup_name  VAP4 
    alias     VAP4_PUSH 
    members     userx, usery } 

define service { 
    host_name      HostA 
    service_description    HostA_HD 
    contact_groups     VAP2,VAP3 } 

define service { 
    host_name      HostB 
    service_description    HostB_HD 
    contact_groups     VAP3,VAP4 } 

그래서 내가 그것을 좋아 분석 할 Services.CFG :

contactgroup_name[0] = "VAP3"; 
alias[0] = "VAP3_PRE"; 
members [0] = "userz,userw"; 

contactgroup_name[1] = "VAP4"; 
alias[1] = "VAP4_PUSH"; 
members [1] = "userx, usery"; 

및 서비스 파일을 :

host_name [0] = "HostA"; 
service_description [0] = "HostA_HD"; 
contact_groups [0] = "VAP2,VAP3"; 

host_name [1] = "HostB"; 
service_description [1] = "HostB_HD"; 
contact_groups [1] = "VAP3,VAP4"; 

그래서 내가이는 CFG 파일의 단지 예입니다, 쉽게 배열처럼 내 PHP 스크립트에서 처리 할 수 ​​있습니다, 그들은 아마도 정규식 또는 preg_match를 함께 ...이 세 가지 정의 이상을 포함 ...?

+0

이름을 기반으로 배열을 만듭니다. 존재하는 경우 데이터를 푸시합니다. - 잠깐 생각해보십시오. – Aaron

답변

0

거의 모든 하프 - 복합 언어 (이 경우 구성)에서, 하나 이상의 토큰과 일치하는 정규 표현식을 통해 구문 분석하면 실패 할 수있는 몇 가지 단점이 있습니다.

는 순진한 접근 방식을 당신이 제공하는 모든 CONTACTGROUP 또는 서비스 예 일치 \1의 종류와 \2의 내용을 넣어 것입니다

/define\s+([^\s]+){([^}]*)}/ 

이 가지는 객체 정의를 해석하는 가정합니다. 그러나 앞면에 #이 있으면이를 필터링해야합니다. 따라서 모든 줄을 순환시키고 주석 줄을 제거해야합니다. 전에 앞에 일치하는 개체 정의가 시작됩니다.

그런 다음 ; comment과 같은 더 많은 댓글이 허용된다는 것을 알게 될 것입니다. 따라서 필터링 할 수도 있습니다. 허용 된 문자에 대해서는 많이 알지 못하지만 어딘가에서 }이 유효하게 포함되어 있다면 문제가 생길 수 있습니다. 그런 경우가 아니라면

, 당신은 아마도 라인에 내용과 preg_split 키가 \1 및 값에

/^\s*([^\s]+)\s+(.*)$/ 

와 객체 정의 내부의 모든 라인을 분할보다 제공되는 첫 번째 정규 표현식을 사용할 수 있습니다 는 \2이지만 값은 trim이어야합니다.