티스토리 뷰

발생일: 2009.09.29

문제:
프렌드 홍이 어떤 똘똘이 아저씨가 만든 자바스크립트 HTML 파서(HTMLParser) 소스를 보여준다.
그 코드 안에 있는 replace 함수가 동작하는 부분이 신기하다고 한다.

소스를 보면 시작 태그를 파싱하는 부분이 있는데, 아래와 같은 코드가 있다.

    var startTag = /^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;

    function parseStartTag( tag, tagName, rest, unary ) {
        // 어쩌고 저쩌고
    }

    // 어쩌고 저쩌고 중략
    match[0].replace( startTag, parseStartTag );

replace 함수는 replace(regex, string) 과 같은 형태로 호출하는 걸로 알고 있는데,
위 함수 모양을 보면 replace(regex, func) 과 같은 형태란 말이지...

코드의 다른 부분을 찾아봐도 replace 가 오버라이드 된 부분이 없다.

이건 뭘까...?


해결책:
Javascript의 replace 함수에 fuction 이 패러미터로 들어갈 수 있었다.

    str.replace(regexp|substr, newSubStr|function[, flags]);

위와 같은 형태로 호출하면 된다.

함수가 패러미터로 들어가게 되면, 매칭되는 값에 따라 그 함수를 수행하게 된다.

패러미터로 들어가는 함수는

    function replacer(str, p1, p2, offset, s) {}

위와 같은 형태이며 각 parameter의 의미는 아래와 같다.

    str: 매치된 문자열

    p1, p2 ... : 매치된 문자열 중 그룹. 정규식에서 () 로 묶여진 것. $1, $2 ... 로 참조되는 값과 같은 값이다.

    offset: 전체 대상 문자열에서 매치된 문자열의 offset index

    s: 전체 대상 문자열

자세한 사항은 Mozilla Developer Center의 javascript replace API 를 참고하자.


#.
저 HTMLParser 를 만든 똘똘한 아저씨는 John Resig 라구 하는구나.
jquery를 만든 사람이라구 한다. 오웅~



반응형
댓글
공지사항