(PHP 4, PHP 5, PHP 7)
preg_match_all — 전역 정규 표현식 매치를 수행합니다
$pattern
, string $subject
, array &$matches
[, int $flags
[, int $offset
]] )
pattern
에 주어진 정규 표현식으로
subject
에서 모든 매치를 찾아내고,
flags
에 지정한 방법에 따라서
matches
에 넣습니다.
처음 매치가 발견된 후, 이후 검색은 마지막 매치의 끝에서부터 이루어집니다.
pattern
탐색할 문자열 패턴.
subject
입력 문자열.
matches
모든 매치의 배열. flags
에 따라서는, 다차원 배열.
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
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 ) )