HTML 파서 – 4.배열 구조의 구성

다차원 배열 구조

앞 장의 예제에서 보았듯이 파서 배열 구조는 다차원 배열(multi-dimensional array)로 구성되어 있습니다.

배열 구조를 보기 위해 사용하였던 var_dump() 함수 대신에 다차원배열 상태 그대로 보게 되면 아래와 같습니다.

제1첨자를 기준으로 보면 총 17개의 부분배열요소가 있다는 것을 알 수 있습니다. 배열 요소 수량은 HTML 문서 내에 있는 태그의 수량에 따라 결정됩니다. 보통은 태그 수량 + 1 의 배열 요소가 생성됩니다.

위에서 17개의 부분배열요소 중에서 첫번째 부분배열요소는 원래의 HTML 문서에는 없던 것으로 추가되어 있는 것을 알 수 있습니다. 만약 HTML 문서상에 나타나는 첫번째 태그 이전에 태그가 아닌 문자가 있다면 첫번째 부분배열요소의 value 첨자의 값의 뒤쪽에 기록됩니다.

예를 들어 위와 같은 HTML 문서를 분석하면 아래와 같은 배열을 얻을 수 있습니다. 아래 결과에서 “<!–HTML_PARSER 0.0.1–>”는 html_parse_into_struct 함수에서 강제로 붙이게 되는 문자열로 파서 함수의 버전을 나타냅니다.

제2첨자 tag, type, attributes, value

제1첨자의 각 부분배열요소를 구성하는 제2첨자를 보면 총 4가지가 존재하게 됩니다.

tag

HTML 태그명을 가리킵니다. 원래의 소스에 관계없이 항상 대문자로 기록됩니다. 만약 태그명이 아닌 경우에는 널문자열(“”)이 기록됩니다. 예를 들어, <TD> 또는 </TD> 인 경우에는 tag 첨자의 요소값에는 TD가 기록됩니다.

type

type에 기록되는 값에는 open, close, cdata 입니다. open은 태그가 시작태그라는 것을 알려주며, close는 종료태그라는 것을 알려줍니다. cdata는 태그가 아닌 순수한 일반 문자(complete data ???)로 구성되어 있는 배열요소임을 알려줍니다.

예를 들어, <TD> 인 경우에는 type 첨자의 요소값으로 open이 기록되고, </TD> 인 경우에는 close가 기록됩니다.

attributes

attributes는 해당 태그의 속성을 기록하고 있습니다. 이 첨자에 대한 요소값은 다른 것과는 달리 부분배열로 기록됩니다.

예를 들어 위와 같은 HTML 문서를 분석하면 아래와 같은 배열을 얻을 수 있습니다.

위의 결과에서 제1첨자 1는 HTML 문서상의 TABLE의 위치에 따라 변동될 수 있습니다. 그리고 속성명은 HTML 문서에서 기록된 그대로 반환됩니다. 0.0.1 초기버전에서는 태그명을 강제로 소문자로 변환하였으나 약간의 문제가 있어 수정하였습니다.

value

앞에서 설명한 tag, type, attributes는 태그에 관련된 배열요소인 반면에 value는 태그가 닫힌 후에 나오는 값이 기록됩니다. 여기서 태그가 닫혔다는 것은 종료태그를 의미하는 것이 아니라 태그의 끝은 의미하는 “>”문자가 나타났다는 것을 의미합니다.

예를 들어 위와 같은 HTML 문서를 분석하면 아래와 같은 배열을 얻을 수 있습니다.

앞 태그와 뒷 태그 사이에 아무런 값이 없다면 앞 태그의 value 배열에는 빈 문자열 또는 하나의 white space가 기록됩니다.

<!– … –> 및 <! …>의 처리

<!– … –>

원래 HTML 문서상에 있던 주석(<!– … –>)은 html_parse_into_struct 함수를 실행하는 중에 모두 삭제됩니다.

<! …>

이러한 코드의 예로는 <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0//EN> 가 있습니다. 이와 같이 <! 로 시작하는 태그는 다른 태그와는 달리 html_parse_into_struct 함수에서 태그로 처리하지 않고 일반 문자열로 처리합니다.

예를 들어 위와 같은 HTML 문서를 분석하면 아래와 같은 배열을 얻을 수 있습니다.

답글 남기기