update : 2015.11.03
php.shukuma.com

검색:
 
 
전역 정규 표현식 매치를 수행합니다

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
        )

)

참고