## 개요
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/*
```
무료 자료
XE → 라이믹스 이전 체크리스트
옮기기 전에 확인할 것, 이전 중 자주 터지는 오류, 옮긴 뒤 손봐야 하는 것을 순서대로 정리했습니다.
아직 댓글이 없어요
이 글에 대한 생각을 가장 먼저 남겨보세요.