PHP 매뉴얼
이전 |  | 다음

# preg_match_all

(PHP 3>= 3.0.9, PHP 4 , PHP 5)

preg_match_all -- 전역 정규 표현식 매치를 수행합니다.

## 설명

int preg_match_all ( string pattern, string subject, array matches [, int flags [, int offset]])

`pattern`에 주어진 정규 표현식으로 `subject`에서 모든 매치를 찾아내고, `flags`에 지정한 방법에 따라서 `matches`에 넣습니다.

처음 매치가 발견된 후, 이후 검색은 마지막 매치의 끝에서부터 이루어집니다.

`flags`는 다음 플래그들을 조합할 수 있습니다 (`PREG_PATTERN_ORDER`와 `PREG_SET_ORDER`를 동시에 사용하지 마십시오):

PREG_PATTERN_ORDER

  $matches[0] 배열이 전체 패턴을 가지고, $matches[1] 배열부터 괄호 안의 서브 패턴을 가지도록 결과를 지정합니다.

  `<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>this is a test</div>", $out, PREG_PATTERN_ORDER); echo $out[0][0].", ".$out[0][1]."\n"; echo $out[1][0].", ".$out[1][1]."\n"; ?>`

  이 예제의 결과:

      <b>example: </b>, <div align=left>this is a test</div>
      example: , this is a test

  $out[0]는 전체 패턴의 문자열 배열을 가지고, $out[1]은 태그 안의 문자열 배열을 가집니다.

PREG_SET_ORDER

  $matchs[0]가 처음 매치의 배열을 가지도록 하고, $matches[1]가 두번째 매치의 배열을 가지도록 결과를 지정합니다.

  `<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>this is a test</div>", $out, PREG_SET_ORDER); echo $out[0][0].", ".$out[0][1]."\n"; echo $out[1][0].", ".$out[1][1]."\n"; ?>`

  이 예제의 결과:

      <b>example: </b>, example:
      <div align="left">this is a test</div>, this is a test

  이 경우에는, $matches[0]는 처음 매치의 집합으로, $matches[0][0]는 전체 패턴을 가지고, $matches[0][1]부터 처음 서브 패턴을 가지게 됩니다. 동일하게, $matches[1]는 두번째 매치의 집합입니다.

PREG_OFFSET_CAPTURE

  이 플래그를 넘기면, 발생한 모든 매치에 대한 문자열의 시작 위치를 함께 반환합니다. `0`에 매치한 문자열을, `1`에 `subject`의 문자열 시작 위치를 가지는 배열을 원소로 하는 배열을 반환합니다. 이 플래그는 `PHP` 4.3.0부터 사용할 수 있습니다.

보통, 검색은 목표 문자열의 처음에서 시작합니다. 선택적인 인자 `offset`으로 검색을 시작할 다른 위치를 지정할 수 있습니다. 이는 preg_match()의 목표 문자열에 substr()($subject, $offset)을 넘기는 것과 동일합니다. `offset` 인자는 `PHP` 4.3.3부터 사용할 수 있습니다.

플러그가 주어지지 않으면, `PREG_PATTERN_ORDER`가 지정됩니다.

전체 패턴이 매치된 횟수(0이 될 수 있음)나, 에러 발생시에 `FALSE`를 반환합니다.

예 1. 어떤 텍스트로부터 모든 전화번호 가져오기

`<?php preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", "Call 555-1212 or 1-800-555-1212", $phones); ?>`

예 2. HTML 태그 찾기 (greedy)

`<?php
// \\2는 역참조의 예제입니다. 이는 PCRE가 정규표현식 자체의
// 두번째 괄호를 가르키며, 이 경우에는 ([\w]+)입니다.
// 문자열이 더블 쿼터(")안에 있을 경우에는 백슬래쉬가 하나 더 필요합니다.
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: " . $matches[0][$i] . "\n";
echo "part 1: " . $matches[1][$i] . "\n";
echo "part 2: " . $matches[3][$i] . "\n";
echo "part 3: " . $matches[4][$i] . "\n\n";
}
?>`

이 예제의 결과:

    matched: <b>bold text</b>
    part 1: <b>
    part 2: bold text
    part 3: </b>

    matched: <a href=howdy.html>click me</a>
    part 1: <a href=howdy.html>
    part 2: click me
    part 3: </a>

참고: preg_match(), preg_replace(), preg_split().

이전 | 처음으로 | 다음
preg_grep | 위로 | preg_match