지식블랙홀 2009. 1. 20. 19:41


preg_match_all 

int preg_match_all ( string pattern, string subject, array matches [, int flags [, int offset]])
PHP 3>= 3.0.9, PHP 4
전역 정 규 표현식 매치를 수행합니다.
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] . "nn";
}
?>
 

이 예제의 결과:
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>