core/classes/template/TemplateHandler.class.php 를 분석하고 있습니다.
displayContent() 함수를 분석하다가 타고 타고 이리로 넘어오게 됐는데요..
private function _replacePath($match)
{
// return origin code when src value started '${'.
debugPrint($match);
if(preg_match('@^\${@', $match[1]))
{
return $match[0];
}
//return origin code when src value include variable.
if(preg_match('@^[\'|"]\s*\.\s*\$@', $match[1]))
{
return $match[0];
}
위의 preg_match('@^\${@', $match[1]) 에서 매치되는 부분이 존재하면, match[0] 을 리턴하게 돼있는데,
이게 무슨 의미인지 모르겠습니다. 그래서 match를 debugPrint() 함수를 이용해서 출력해봤습니다.
[classes/template/TemplateHandler.class.php:451] TemplateHandler->_replacePath() (Memory usage: current=2.63MB, peak=7.06MB): array('0'=>'<img src="/img/ico_default.jpg"', '1'=>'./img/ico_default.jpg')
이런식으로 나오는데 어떻게 받아들여야 할지 모르겠네요. 무슨뜻인지 혹시 아시는분 계시면 지식공유 부탁드립니다!
댓글 4
이 함수는 정규식을 이용해서 템플릿 파일 내의 상대경로를 절대경로로 바꿔 주는 기능입니다. 템플릿을 개발하는 분은 템플릿 파일을 기준으로 적당히 상대경로만 입력해 놓으면 (예: css/example.css) 그 템플릿을 사용하는 각 사이트의 XE 설치 경로에 맞게 (예: /xe/modules/모듈명/skins/스킨명/css/example.css) 자동으로 변환이 됩니다. 템플릿 개발자가 각 사이트의 설치 경로까지 신경쓸 필요가 없도록 하기 위해서입니다.
TemplateHandler.class.php 239줄에서 preg_replace_callback 함수를 사용하면서 콜백 함수로 지정한 것이 _replacePath 함수입니다. 즉 239줄의 정규식에 매칭되는 것들이 _replacePath 함수에 하나씩 $match로 들어오고, _replacePath 함수에서 적당히 조작하여 결과를 반환하면 239줄에서 그 결과로 치환되는 것입니다. 두 군데를 동시에 봐야 합니다. (클로져를 지원하지 않는 PHP 구버전에서는 정규식을 사용해서 복잡한 치환을 하려면 항상 이렇게 별도의 함수를 정의해야 했습니다.)
이 함수에서 $match[0]을 반환한다는 것은 "치환하지 말고 그대로 둬라"는 뜻입니다. 정규식으로 콜백 함수를 호출하면 $match[0]에는 원래의 문자열이 그대로 담기고, $match[1], $match[2] 등에는 정규식으로 추출해 낸 조각들이 담기거든요. 원래의 문자열을 그대로 돌려주었으니 아무 것도 치환하지 말라는 뜻이지요.
정규식 공부를 좀더 해보세요 *^^*
기진곰님을 보고, 저도 가능한 많이 나누어야겠다는 생각이 듭니다ㅎ