일단, 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 ) ) )
오옷! 좋은 글 감사합니다. 겨우 이해가 갑니다. ^^;;
질문 있으면 댓글 달아주길! 이라는말에 희망을 걸고 댓글을 달아봅니다.
제가 좀 긴 헤태그를 빼내려고합니다
$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 …?
분명히 풀었는데… 왜 이렇게나올가영