2009-11-17 3 views
0

PHP에서 의사 변수 파서를 작성하여보기에 깨끗하고 간단한 구문을 허용하고 if 문에 엔진을 구현했습니다. 이제 중첩 된 if 문을 사용할 수 있기를 원하며 가장 단순하고 세련된 해결책은 식별자를 블록의 표식으로 사용하는 것입니다.preg_match_all에서 regex 변수 사용하기

{if x is empty} 
    {if y is array} 
     Hello World 
    {endif} 
{endif} 

스크립트는 첫 번째 경우 문을 발견하고 같은 깊이에 ENDIF와 일치합니다 :

그래서이 basicly 내가보기에 찾고 있어요 레이아웃입니다. true로 평가되면 내부 블록도 구문 분석됩니다. ,

preg_match_all('|([\t ]?){if (.+?) is (.+?)}(.+?){endif}|s', $template, $match); 

은 기본적으로 내가 ([\t ]?)의 첫 경기는 변수의 어떤 종류를 사용 {endif} 전에 배치 할 :

지금, 나는 다음과 같은 코드에 깊이를 사용하는 정규 표현식을 설정하는 데 문제가 {if ...}과 동일한 깊이에 일치하는 {endif}이없는 경우 명세서가 완전하지 않은지 확인하십시오.

완성 해 주시겠습니까?

+1

이러한 이유 중 하나를 사용하고 싶지 않은 이유는 무엇입니까? http://www.webresourcesdepot.com/19-promising-php-template-engines/ –

+0

CodeIgniter에 내장 된 템플릿 enginge을 확장하고 필요한 if 문만 있으면됩니다. – Christoffer

답변

0

\ 1은 첫 경기를 포함, 그래서 당신이 할 수있는 :

preg_match_all('|([\t ]?){if (.+?) is (.+?)}(.+?)\1{endif}|s', $template, $match); 

그러나, 이것은 반드시 앞에는 {ENDIF}, 다음 일치 항목 만의 정확한 발생을 일치하지 않습니다를 올바른 탭 수.

2

정의한 언어가 일반이 아니기 때문에 (이 경우는 {if}{endif}의 집계를 필요로하므로) 일반적으로이 문제에 대한 정규 표현식을 사용할 수 없습니다.

기존 괄호 문제의 변형입니다.

Finite-state machine을 사용하면 {if}{endif}의 발생을 추적하는 것이 더 나을 것입니다.

0

명시 적 "endif"문을 사용하고 있고 차단이 이미 완료되어 있고 특수 들여 쓰기가 필요하지 않은 경우 '/{if.+?}(.+?){endif}/ '. 1, 다른 측면에서, 당신은 파이썬 모두 들여 쓰기 블록, 당신은 {ENDIF} (대괄호) 만 일치 들여 쓰기 수준을 제거 할 수있는 경우

if condition 
     this line is in the if block 
     this one too 
    this one not 

표현식이

처럼 될 것입니다
/([\t]+)if(.+)\n((\1[\t]+.+\n)+)/ 

"조건은"제대로 있는지 /{if}((.(?!{if))+?){endif}/s 같은 중첩 처리하기 위해 실제로이어야 경기 2 문 본문 경기 3

1 될 것입니다.