2015-01-24 4 views
2

여러 공백을 무시하고 주어진 템플릿의 내용과 모든PHP 정규식 - 나는 현재 간단한 PHP 템플릿 엔진에서 일하고 있어요

{% include file="anotherTemplate.tpl" %} 

를 교체합니다. 이 작업에서는 정규식을 사용합니다.

private $funcSeparatorL = '{%'; 
private $funcSeparatorR = '%}'; 

// ... 

preg_match('/' . $this->funcSeparatorL . ' include file="(.*)\.(.*)" ' . $this->funcSeparatorR . '/', $this->content) 

이것은 잘 작동하지만 구분자와 중간 사이의 공백 사이에는 공백이 하나만 있습니다. 나는 여러 가지 공간을 사용하여 전체 오류를 더 잘 견딜 수 있기를 원합니다.

그러나 복수 문자와 일치 시키려면 .*을 사용하면 전체 페이지가 영원히로드되고 완료되지 않습니다.

preg_match('/' . $this->funcSeparatorL . '.*include file="(.*)\.(.*)".*' . $this->funcSeparatorR . '/', $this->content) 

.*는 작업 및 예하면, 왜 이러한 오류가 발생할 않습니다를 처리 할 수있는 적절한 방법이 있나요?

답변

0

.* 대신 \s*을 사용하십시오. 공백과 일치하고 catastrophic backtracking을 피할 수 있습니다. 이것이 현재의 문제의 원인입니다.

예 : 여담으로

preg_match('/' . $this -> funcSeparatorL . '\s*include file="(.*)\.(.*)".*' . $this -> funcSeparatorR . '/', $this -> content); 

, 당신도 모든 다른 .*의 제거하기가 더 전체 정규 표현식을 개선, 또는 가능하면 그 이외의 욕심하게 할 수 있습니다. 테스트되지 않은 예 :

preg_match('/' . $this -> funcSeparatorL . '\s*include file="([^"]*?)\.([^"]*)".*?' . $this -> funcSeparatorR . '/', $this -> content); 

Here's a demo

마지막으로 .*?[^}]*으로 바꾸면이 기능을 더 향상시킬 수 있지만 중첩 된 템플릿 표현식을 허용하는지 여부에 따라 다릅니다.

규칙 : 비 탐욕적 한정자 (?)없이 .+ 또는 .*을 입력하면 확률이 매우 높아져서 잘못된 결과가 발생합니다.

+0

답변 주셔서 감사하지만 불행히도 예제가 작동하지 않았습니다. :/ –

+0

작동하지 않는 것을 명확히 할 수 있습니까? preg_match는 대치 작업을 수행하지 않고 그냥 일치하는 것을 유의하십시오. 대신에 preg_replace가 필요합니다. –

+0

물론, while 루프 내에서'preg_match'를 사용하고 각각의 경우에 대해 뭔가를 반향합니다. 필자의 첫 번째 접근 방식에서는 파일의 모든 포함에 대해 반향을 나타내지 만 예제에서는 포함과 일치하지 않습니다. –

관련 문제