홈/XE 홈페이지 제작 가이드 및 팁 | 이온디 - 10년 경력 XE 전문가/글 보기 XE/Rhymix 템플릿 v1 중괄호 중첩 문제 해결 이온디 2026.01.23 09:51 조회 2608 댓글 0 목록 추천 0 목차 ## 개요 XE/Rhymix의 템플릿 v1에서 `{@ }` PHP 코드 블록 내에 중괄호 `{ }`를 중첩해서 사용할 수 없는 문제가 있었습니다. 이 문서는 해당 문제의 원인과 해결 방법을 설명합니다. ## 문제 상황 ### 기존에 동작하지 않던 코드 ```html {@ if($condition){ echo "true"; } } {@ foreach($list as $item){ echo $item; } } {@ if($a){ if($b){ echo "nested"; } } } ``` ### 기존 우회 방법 중괄호를 사용하는 제어문은 `` 주석 문법을 사용해야 했습니다: ```html 조건이 참일 때 내용 {$item} ``` ## 원인 분석 ### 문제가 되는 코드 위치 **파일**: `common/framework/parsers/template/TemplateParser_v1.php` **라인**: 57 ### 기존 정규식 ```php $content = preg_replace_callback( '/{(@[\s\S]+?|(?=[\$\\\\]\w+|_{1,2}[A-Z]+|[!\(+-]|\w+(?:\(|::)|\d+|[\'"].*?[\'"]).+?)}|...', array($this, '_parseResource'), $content ); ``` ### 문제의 핵심 `{@[\s\S]+?}` 패턴에서 `+?`가 **non-greedy (최소 매칭)**이므로 첫 번째 `}`를 만나면 매칭이 종료됩니다. ``` 입력: {@ if($a){ echo 1; } } ^ └── 여기서 매칭 종료! 결과: {@ if($a){ (불완전한 매칭) ``` ## 해결 방법 ### 개선된 정규식 중괄호의 중첩을 올바르게 처리하는 **재귀적 패턴**을 사용합니다: ```php // 기존 패턴 (문제 발생) {@[\s\S]+?} // 개선된 패턴 (중첩 지원) {@(?:[^{}]++|\{(?:[^{}]++|\{(?:[^{}]++|\{[^{}]*\})*\})*\})*+} ``` ### 패턴 설명 | 구성 요소 | 설명 | |----------|------| | `[^{}]++` | 중괄호가 아닌 문자들 (possessive quantifier) | | `\{...\}` | 중첩된 중괄호 블록 | | `(?:...)*` | 비캡처 그룹의 반복 | | `*+` | Possessive quantifier (백트래킹 방지) | 이 패턴은 최대 **4단계**까지 중첩된 중괄호를 지원합니다. ## 수정 방법 ### 1. 파일 열기 ``` common/framework/parsers/template/TemplateParser_v1.php ``` ### 2. 57번 라인 수정 **수정 전:** ```php // include, unload/load, import $content = preg_replace_callback('/{(@[\s\S]+?|(?=[\$\\\\]\w+|_{1,2}[A-Z]+|[!\(+-]|\w+(?:\(|::)|\d+|[\'"].*?[\'"]).+?)}|<(!--[#%])?(include|import|(un)?load(?(4)|(?:_js_plugin)?)|config)(?(2)\(["\']([^"\']+)["\'])(.*?)(?(2)\)--|\/)>|(\s*)/', array($this, '_parseResource'), $content); ``` **수정 후:** ```php // include, unload/load, import // 중첩 중괄호 지원을 위한 개선된 패턴: {@ if($a){ echo 1; } } 형태 지원 $content = preg_replace_callback('/{(@(?:[^{}]++|\{(?:[^{}]++|\{(?:[^{}]++|\{[^{}]*\})*\})*\})*+|(?=[\$\\\\]\w+|_{1,2}[A-Z]+|[!\(+-]|\w+(?:\(|::)|\d+|[\'"].*?[\'"]).+?)}|<(!--[#%])?(include|import|(un)?load(?(4)|(?:_js_plugin)?)|config)(?(2)\(["\']([^"\']+)["\'])(.*?)(?(2)\)--|\/)>|(\s*)/', array($this, '_parseResource'), $content); ``` ### 3. 캐시 삭제 템플릿 캐시를 삭제하여 새 파서가 적용되도록 합니다: ```bash rm -rf files/cache/template/* ``` 다음안녕난AI야AI 발달로AI게발이되고있어 이전제로보드XE PHP8에 맞게 완벽 대응 댓글 0 첫 댓글을 남겨보세요. 댓글을 작성하려면 로그인이 필요합니다. 로그인하기
첫 댓글을 남겨보세요.