XETOWN

질문/답변

웹에 관련된 질문과 답변을 나눌 수 있습니다.

 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 에서도 형식에 맞지 않는다고 뜨고.. 아시는분 지식 공유 부탁드립니다ㅠ

 

  • profile
    기진곰 2016.08.13 00:29:23

    자바스크립트의 정규식은 반드시 /슬래시/로 감싸야 하지만 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을 사용하여 ":" 바로 뒤에 있는 "//"는 매칭하지 않습니다.

  • ?
    갸라 2016.08.13 00:48:23
    친절한 설명 감사합니다!! 정규표현식이 언어마다 다르게 적용된다는건 처음알았네요~
    기진곰님 덕분에 매번 많이 알아갑니다ㅎㅎ

위로
서버에 요청 중입니다. 잠시만 기다려 주십시오...