2013-03-14 3 views
0

간단한 템플릿 언어를 작성했지만 중첩 된 문장에 문제가 있습니다.PHP 템플릿 언어

preg_match('/\{foreach +\$(.*?)\}(.*?){\/foreach\}/sui', $this->content, $matches); 

모든 것이 잘 작동,하지만 난 foreach 문에서 foreach 문을 중첩 할 때, 나는 오류가 예를 들어 나는의 Foreach이 정규 표현식에 사용. 정규 표현식은 첫 번째 여는 태그지만 두 번째 닫는 태그를 얻기 때문에.

{foreach는 $의 XY}

{foreach는 $의 YX} {/ foreach는}

{/ foreach는}

나는이 문제를 어떻게 해결할 수 있습니까? 고맙습니다!

+3

정규식은 일반적으로 중첩 된 구문을 처리하는 데 적합하지 않습니다. –

+2

다음을 읽어야합니다. http://stackoverflow.com/a/1732454/1225541 – alestanis

+1

정규식은 언어 구문 분석에 적합하지 않습니다. 방금 이유를 발견했습니다. 또한 많은 좋은 해결책이 이미 존재할 때 자신의 템플릿 언어를 쓰지 못하게 할 것입니다. –

답변

0

주석에서 언급했듯이 정규 표현식은 중첩 된 컨텍스트를 파싱하는 데는 적합하지 않습니다. (. 당신이 결과의 파스 트리를 구축하려는 특히 경우)

덜 당신은 그것을 일치 할 수 없다 마십시오 :

preg_match_all(',{foreach \s++ \$\w++ } (?: [^{}]++ | (?R))*+ {/foreach},xi', $str, $matches); 

것은이 당신에게 줄 것이다 :

(?xi) {foreach \s++ \$\w++ } (?: [^{}]++ | (?R))*+ {/foreach} 

은으로 사용 될 수 있습니다 바깥 쪽 매치.

+0

템플릿 언어에'{if} '와 같은 중괄호를 사용하는 다른 구문이있는 경우 중단됩니다. 재귀와 같은 고급 정규식 기능은 멋지다. 기술적으로는 파서를 만들 수도 있지만 정규식 이외의 패러다임을 정규식 구문으로 강제 적용하는 것이 좋습니다. –

+0

@ dan1111, 정규식이 정규가 아닙니다. 이것은 공식 언어 이론이 아닙니다. – Qtax

+0

나는 이론에 대해 말하는 것이 아닙니다. 내 요점은 만약 당신이 정규 표현식으로 매우 복잡한 것을하려고하면, 당신은 그들의 힘을 뛰어 넘을 것이라는 것이다. –