티스토리 뷰

템플릿을 위한 간단한 부분 캡쳐

[BLOCK] 과 [ENDBLOCK] 으로 둘러 쌓인 곳을 캡쳐하여, test_1 이라는 이름으로 반복문을 돌릴 경우 입니다.
test_1 은 변수명이 되는게 가장 수월하겠죠. 해당 변수의 배열만큼 반복문을 돌리는 것입니다.

이렇게 구문이 확연히 나눠져 있다면 캡쳐하는 것은 그리 어렵지 않습니다. 반대로 HTML 같이 여러 태그가 중첩되거나 중복되게 되면 복잡해 지죠. 왜냐하면 HTML 에서 끝나는 테그는 단지 테그명만 명시되어 있어 알기가 어렵습니다. </DIV> 테그와 짝을 이루는 것이 어떤 <DIV> 테그인지 알기 위해서는 HTML 테그들을 분석해봐야 합니다.
$str = "<table>
[BLOCK test_1]
<tr>
    <td>TEST</td>
</tr>
[ENDBLOCK test_1]
</table> ";

preg_match('!\[(BLOCK)[\s]+([\w\d_]+)\](.*?)\[END\1[\s]+\2\]!s', $str, $matches);

이 정규식은 역참조를 이용해서 작성하였는데 그 이유는 정규식의 확장성과 정확성을 높이기 위한 것입니다. 예를들어 [BLOCK] 테그 외에 [URL], [IMG] 등 다른 테그를 추가 하려면, 정규식 앞 부분에만 적어주면 됩니다.

예)
\[(BLOCK)[\s]+ 에서 (BLOCK) 에 테그를 추가합니다.
\[(BLOCK|URL|IMG)[\s]+

또한 정규식에 의해 매칭된 변수와 같은 블록을 찾기 위해 변수명 부분에도 역참조를 이용해서 작성하였습니다.
참고로, 역참조는 괄호()로 이뤄진 부분을 참조할 수 있으며, 왼쪽부터 1부터 번호가 매겨집니다. 테스트 해본 결과로는 10번 이상까지 사용이 가능하더군요.

쌍따옴표, 홀따옴표 캡쳐하기

이 예제는 지난 활용 3번에서 다루었었는데, 좀더 세세히 설명을 드리기 위해 추가합니다. 기존의 HTML 테그를 캡쳐하기 위한 코드와 캡쳐한 테그에서 각 속성을 캡쳐하기 위한 함수로 되어 있습니다.
$content = <<<__HTML__
<P align=left>테스트 문자열<BR>
<A href="http://kais.tistory.com/" lx=+1 title="따옴표 안에 > \"따옴표\" < 넣기" target="_blank">
<IMG alt=http://kais.tistory.com/ title=" <<'따옴표' 안에 테그를
넣어도 정확히 검출됨>> " src="http://test/test.jpg"></A></p>
<div style='clear:both;' lb_exif='Y' lvl="" onClick='testFunc(\'<TEST>\');'>테스트 문자열</div>
__HTML__;

// 속성이 있는 테그만 캡쳐
preg_match_all(
    '@<([a-zA-Z]+)\s+
        ((?:[\w]+[\s]*=[\s]*             # 영문,숫자,언더바(_)로 시작하는 속성명
            (?:"(?(?=\\\\")\\\\"|.*?)*?"   # 쌍따옴표(")
            |\'(?(?=\\\\\')\\\\\'|.*?)*?\' # 홀따옴표(\')
            |[^\s<>]+)                     # 따옴표가 없는 경우, 공백 또는 <>까지
        \s*)*?)                          # 전체 속성을 검출하기 위해 ( )를 두개씀
    /?>@xs', $content, $match);

echo '<ul>';

foreach ($match[2] as $value) {
    // 테그에서 속성 부분 모두 검색
    preg_match_all(
        '@([\w]+)[\s]*=[\s]*
            ("(?(?=\\\\")\\\\"|.*?)*?"     # 쌍따옴표(")
            |\'(?(?=\\\\\')\\\\\'|.*?)*?\' # 홀따옴표(\')
            |[^\s<>]+)
        @xs', $value, $attrs, PREG_SET_ORDER);

    // 출력용
    // 출력시 값은 trim(value, '"\'') 함수를 사용해서 따옴표를 없애줘야 함.
    foreach ($attrs as $t) {
        echo '<li><b>패턴</b>: '. htmlspecialchars($t[0]) .'<br />'
            .'<b>속성</b>: '. $t[1] .' , '
            .'<b>값</b>: '. trim(htmlspecialchars($t[2]), '"\'') .'<br /><br /></li>';
    }
}
echo '</ul>';
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함