(PHP 4, PHP 5)
preg_match_all — 전역 정규 표현식 매치를 수행합니다
pattern 에 주어진 정규 표현식으로 subject 에서 모든 매치를 찾아내고, flags 에 지정한 방법에 따라서 matches 에 넣습니다.
처음 매치가 발견된 후, 이후 검색은 마지막 매치의 끝에서부터 이루어집니다.
탐색할 문자열 패턴.
입력 문자열.
모든 매치의 배열. flags 에 따라서는, 다차원 배열.
다음 플래그들을 조합할 수 있습니다 (PREG_PATTERN_ORDER와 PREG_SET_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]은 태그 안의 문자열 배열을 가집니다.
$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 오프셋에 가지고, 문자열 오프셋을 1 오프셋에 가지게 됩니다.
플래그가 주어지지 않으면, PREG_PATTERN_ORDER로 취급합니다.
일반적으로, 주제 문자열의 처음부터 탐색을 시작합니다. 선택적인 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 ) )