Forum und email

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

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

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

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

PREG_OFFSET_CAPTURE

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

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

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

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

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

for (
$i=0$icount($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().