PCRE 함수 목록
PHP Manual

preg_match_all

(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 에 넣습니다.

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

인수

pattern

탐색할 문자열 패턴.

subject

입력 문자열.

matches

모든 매치의 배열. flags 에 따라서는, 다차원 배열.

flags

다음 플래그들을 조합할 수 있습니다 (PREG_PATTERN_ORDERPREG_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>",
    
$outPREG_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>",
    
$outPREG_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

PREG_OFFSET_CAPTURE

이 플래그를 넘기면, 모든 발생한 매치와 함께 오프셋을 반환합니다. 이는 배열에서 matches 의 값을 변경하는 점에 주의하십시오. 배열의 모든 원소는 매치한 문자열을 0 오프셋에 가지고, 문자열 오프셋을 1 오프셋에 가지게 됩니다.

플래그가 주어지지 않으면, PREG_PATTERN_ORDER로 취급합니다.

offset

일반적으로, 주제 문자열의 처음부터 탐색을 시작합니다. 선택적인 offset 인수로 탐색을 시작할 다른 위치를 지정할 수 있습니다. (바이트 단위)

Note: offset 을 사용하는 것은 preg_match_all()의 주제 문자열로 substr($subject, $offset)을 사용하는 것과는 다릅니다. pattern^, $, (?<=x) 등을 사용할 수 있기 때문입니다. preg_match()에서 예제를 확인해 보십시오.

반환값

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

변경점

버전 설명
4.3.3 offset 인수 추가
4.3.0 PREG_OFFSET_CAPTURE 플래그 추가

예제

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

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

Example #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);

foreach (
$matches as $val) {
  echo 
"matched: " $val[0] . "\n";
  echo 
"part 1: " $val[1] . "\n";
  echo 
"part 2: " $val[3] . "\n";
  echo 
"part 3: " $val[4] . "\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>

Example #3 이름 있는 서브패턴 사용하기

<?php

$str 
= <<<FOO
a: 1
b: 2
c: 3
FOO;

preg_match_all('/(?<name>\w+): (?<digit>\d+)/'$str$matches);

print_r($matches);

?>

위 예제의 출력:

Array
(
    [0] => Array
        (
            [0] => a: 1
            [1] => b: 2
            [2] => c: 3
        )

    [name] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [digit] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [2] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)

참고


PCRE 함수 목록
PHP Manual