[PHP] preg_match_all 함수 사용법

일단, PHP.net의 preg_match_all 공식 설명을 참고했다.

이 함수는 기본적으로 정규식에 맞는 문자열을 배열어 넣어주는 함수다. 어떤 방식으로 넣을지 옵션을 줄 수 있다. 옵션이 세 개인데, 다음 예제 코드에 각각 다른 옵션을 이해할 수 있도록 해 뒀다. 정규식에 대한 이해는 기본으로 있다고 가정한다.

$subject = '<ul>
	<li><a href="/#issuebar">메인기사</a></li>
	<li><a href="/#special-article-section">특집기사</a></li>
	<li><a class="toggle-recommand" href="/#shortcut-recommand">추천기사</a></li>
	<li><a href="/9_subscribe.php?from=mainNav">정기구독</a></li>
	<li><a href="/B_support.php?from=mainNav">후원</a></li>
</ul>';
$pattern = '/"\/#(.+)"/';
preg_match_all($pattern, $subject, $matches1, PREG_PATTERN_ORDER);
preg_match_all($pattern, $subject, $matches2, PREG_SET_ORDER);
preg_match_all($pattern, $subject, $matches3, PREG_OFFSET_CAPTURE);
echo '<pre>';
echo '<h1>$subject : </h1>';
print_r(htmlspecialchars($subject));
echo '<h1>PREG_PATTERN_ORDER : </h1>';
print_r($matches1);
echo '<h1>PREG_SET_ORDER : </h1>';
print_r($matches2);
echo '<h1>PREG_OFFSET_CAPTURE : </h1>';
print_r($matches3);
echo '</pre>';

이렇게 코드를 넣으면 아래와 같이 출력이 된다.

배열이 좀 많아서 골치가 아플 텐데, 우선 전체 정규식에 매치된 놈은 앞부분에 넣어 주고, 정규식에 포함된 각 괄호들을 뒷부분에 넣어 주는 것으로 이해하면 된다. 위에선 정규식을 /"\/#(.+)"/ 이렇게 집어 넣었는데, (.+)가 바로 뒷부분 배열에 들어간 놈이다. 괄호로 여러 개가 묶여 있다면 여러 개를 반환해 준다.

PREG_PATTERN_ORDER 로 옵션을 줬을 때는 일단 앞의 배열에 전체 정규식에 매칭된 놈들을 한꺼번에 넣어 주고, 뒤의 배열에는 괄호에 맞는 놈을 또 한꺼번에 넣어 준다. 괄호가 여러 개라면 뒤에 계속 배열을 더 붙여서 넣어 줄 거다. 이 예제의 경우 전체 정규식에 맞는 놈은 3개고, 괄호는 하나니까 원소 3개짜리 배열 2개가 들어 있는 것이다.

PREG_SET_ORDER로 하면 전체 정규식에 맞는 놈, 각 괄호에 맞는 놈을 한 배열씩 만들어서 차례로 넣어 준다. 이 예제의 경우 전체 정규식에 맞는 놈은 3개고, 괄호는 하나니까 원소 2개짜리 배열 3개가 들어 있다.

PREG_OFFSET_CAPTURE는 문자열의 위치를 함께 넣어 반환해 주는 것이다. PREG_PATTERN_ORDER로 결과를 반환해 주면서 문자열의 위치도 함께 반환해 줬는데, PREG_SET_ORDER 형태로 반환받고 싶다면 preg_match_all($pattern, $subject, $matches4, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); 형태로 사용하면 된다.

질문이 있으면 댓글 달아 주길.

$subject : 

<ul>
	<li><a href="/#issuebar">메인기사</a></li>
	<li><a href="/#special-article-section">특집기사</a></li>
	<li><a class="toggle-recommand" href="/#shortcut-recommand">추천기사</a></li>
	<li><a href="/9_subscribe.php?from=mainNav">정기구독</a></li>
	<li><a href="/B_support.php?from=mainNav">후원</a></li>
</ul>

PREG_PATTERN_ORDER : 

Array
(
    [0] => Array
        (
            [0] => "/#issuebar"
            [1] => "/#special-article-section"
            [2] => "/#shortcut-recommand"
        )

    [1] => Array
        (
            [0] => issuebar
            [1] => special-article-section
            [2] => shortcut-recommand
        )

)
PREG_SET_ORDER : 

Array
(
    [0] => Array
        (
            [0] => "/#issuebar"
            [1] => issuebar
        )

    [1] => Array
        (
            [0] => "/#special-article-section"
            [1] => special-article-section
        )

    [2] => Array
        (
            [0] => "/#shortcut-recommand"
            [1] => shortcut-recommand
        )

)
PREG_OFFSET_CAPTURE : 

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => "/#issuebar"
                    [1] => 18
                )

            [1] => Array
                (
                    [0] => "/#special-article-section"
                    [1] => 66
                )

            [2] => Array
                (
                    [0] => "/#shortcut-recommand"
                    [1] => 154
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [0] => issuebar
                    [1] => 21
                )

            [1] => Array
                (
                    [0] => special-article-section
                    [1] => 69
                )

            [2] => Array
                (
                    [0] => shortcut-recommand
                    [1] => 157
                )

        )

)

👇 카테고리 글 목록

대표글

“[PHP] preg_match_all 함수 사용법”에 대한 2개의 응답

  1. 오옷! 좋은 글 감사합니다. 겨우 이해가 갑니다. ^^;;

  2. 질문 있으면 댓글 달아주길! 이라는말에 희망을 걸고 댓글을 달아봅니다.

    제가 좀 긴 헤태그를 빼내려고합니다
    $pattern = ‘/(.*)/uis’;
    요로 코롬
    PREG_PATTERN_ORDER, PREG_SET_ORDER, PREG_OFFSET_CAPTURE 이놈들을 사용하니 Array 배열로 나오네요
    그래서 제가 이 배열을 풀어서 출력하려고 합니다
    요로코롬
    echo ‘PREG_PATTERN_ORDER : ‘;
    for($i=0; $i<sizeof($matches1); $i++)
    {
    echo $matches1[$i]."”;
    }
    이렇게 했는데.. 이것 또한 Array Array …?
    분명히 풀었는데… 왜 이렇게나올가영

듈선장 에 응답 남기기응답 취소