core/classes/frontendfile/FrontEndFileHandler.class.php 파일에 있는 _normalizeFilePath() 함수를 보고 있습니다.
이 함수 내에
elseif(!strncmp($path, '//', 2)) { return preg_replace('#^//+#', '//', $path); } $path = preg_replace('@/\./|(?<!:)\/\/@', '/', $path); while(strpos($path, '/../')) { $path = preg_replace('/\/([^\/]+)\/\.\.\//s', '/', $path, 1); }
#^//+# 하고 @/\./|(?<!:)\/\/@ 이부분을 어떻게 해석해야할지 모르겠네요.
preg_replace(pattern, replace_str, original_str) 함수가 original_str 에서 pattern에 맞는 문자열을 찾아서 replace_str로 바꿔주는 함수로 알고,, 정규표현식 패턴이구나 싶어서 그 쪽으로 접근했는데 모르겠네요.
정규표현식 테스트 사이트 regexr.com 에서도 형식에 맞지 않는다고 뜨고.. 아시는분 지식 공유 부탁드립니다ㅠ
자바스크립트의 정규식은 반드시 /슬래시/로 감싸야 하지만 PHP는 양쪽이 똑같기만 하면 다 받아줍니다.
정규식 안에 "/" 문자가 들어가는 경우 혼란을 막기 위해 아주 편한 기능인데,
regexr 같은 곳에서는 안 받아주죠 ㅎㅎ
아무튼 앞뒤가 같은 특수문자는 "여기부터 여기까지 정규식이다"라는 뜻이므로 해석할 때는 무시해도 됩니다.
#^//+# → (실제 정규식은 ^//+ 입니다) → "/"로 시작하고 "/"가 1개 이상 더 있는 경우를 찾습니다.
HTTP 주소와 HTTPS 주소 모두 호환되는 외부 리소스를 로딩할 때
//fonts.googleapis.com/css?family=Open+Sans 이렇게 "//"로 시작하는 주소를 종종 쓰는데,
예전의 XE에서는 이런 주소를 입력하려면 ///fonts.googleapis.com 이렇게 "/"를 3개 입력해야 했어요.
요즘은 2개만 입력해도 정상 작동하므로, 예전 방식처럼 3개 입력한 경우 2개로 줄여 주는 정규식입니다.
@/\./|(?<!:)\/\/@ → (실제 정규식은 /\./|(?<!:)\/\/ 입니다)
한글 폰트에서 흔히 "\"로 표시되는 백슬래시(\) 문자는 특수기호 입력을 위해 사용한 것이니 일단 무시하고요...
"|"를 기준으로 구분하여 두 가지 서로 다른 것을 매칭하고 있습니다.
첫째는 example.com/xe/./files/attach 이렇게 불필요한 점이 들어간 부분을 찾아서
example.com/xe/files/attach 이렇게 "/" 하나만 남기고 삭제합니다.
둘째는 example.com/xe//files/attach 이렇게 "/"가 이중으로 들어간 부분을 찾아서
마찬가지로 하나만 남기고 삭제합니다.
단, "http://" 형태로 되어 있는 것까지 "/"를 하나로 줄이면 곤란하므로
(?<!:) negative lookbehind assertion을 사용하여 ":" 바로 뒤에 있는 "//"는 매칭하지 않습니다.