preg_match_all
(PHP 4, PHP 5)
preg_match_all — 전역 정규 표현식 매치를 수행합니다.
설명
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를 반환합니다.
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; $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>