프리이미지
사이트 내 전체검색

정규표현식 이용하기, preg_match, preg_match_all 함수 알아보기

페이지 정보

작성일14-07-25 12:45

본문

 

8090937859.png


int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )


  • 정규표현식 매치를 수행 (PHP 4, PHP 5)
  • 첫번째 매치가 일어나면 실행을 중지(최대 매치횟수는 1회)
  • 매치가 된 횟수를 반환하며, 0 또는 1을 반환하며, 오류시에는 FALSE를 반환
  • 파라매터
    • $pattern - 검색할 정규식 문자열
    • $subject - 찾고자 하는 대상 문자열
    • $matches - 검색결과를 반환받을 변수
    • $flags - 'PREG_OFFSET_CAPTURE' 값을 지정하면 모든 매치에 대한 문자열 시작 위치를 반환
    • $offset - 검색을 시작할 위치를 지정(바이트 단위), 생략시 처음부터 검색
  • $matches 파라메터 변수
    • 이 변수가 지정되면 검색된 결과를 배열로 저장함
    • $matches[0]은 전체패턴 내용이 들어가고,
    • $matches[1]은 괄호로 둘러싼 서브 패턴이 들어감
    • 플래그 값이 'PREG_OFFSET_CAPTURE'가 지정되면,
      • $matches[0]에는 매치한 문자열이,
      • $matches[1]에는 매치된 문자열의 시작위치를 저장

예제) 이름있는 서브패턴 사용하기(PHP 메뉴얼 발췌)
소스:
<?php

$str 
'foobar: 2008';

preg_match('/(?<name>\w+): (?<digit>\d+/'$str$matches);

print_r($matches);

?> 

출력값:
Array ( [0] => foobar: 2008 [name] => foobar [1] => foobar [digit] => 2008 [2] => 2008 )
설명:

 [0]에는 정규식에 매치된 전체패턴값인 'foobar: 2008'값이 저장이 되며, [1]에는 서브패턴의 값이 들어가는데, ()안에 매치된 값이 저장이 된다.
서브패턴이 두개가 존재하므로 [1][2]에 각각 매치된 값이 들어가며, 
서브패턴 name이 지정되어 지정된 name으로 연관배열로 이용이 가능하다.

int preg_match_all ( string $pattern , string $subject, array &$matches [, int flags = PREG_PATTERN_ORDER [, int $offset = 0 ]] )

  • 전역 정규표현식 매치를 수행 (PHP 4, PHP 5)
  • 전체 매치된 횟수를 반환하며, 오류시 FALSE를 반환
  • $matches 파라메터 변수와 $flags 파라메터 변수
    • 이 변수가 지정되면 검색된 결과를 다차원 배열로 저장함
    • $flags 값이 'PREG_PATTERN_ORDER'이 지정되면
      • $matches[0]은 전체 패턴 내용이 들어가고,
      • $matches[1]은 괄호로 둘러싼 서브 패턴이 들어감
    • $flags 값이 'PREG_SET_ORDER'이 지정되면
      • $matches[0]은 처음 매치의 배열을 가지고,
      • $matches[1]은 두번째 매치의 배열이 들어감
    • $flags 값이 'PREG_OFFSET_CAPTURE'이 지정되면 모든 발생한 매치와 함께 오프셋을 반환
    • 플래그값이 지정되지 않으면, 'PREG_PATTERN_ORDER'로 지정됨

예제) 플래그가 'PREG_PATTERN_ORDER'로 지정되었을때, $matches값의 변화
소스: 
<?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

설명:
위 정규식은 총 2번이 매치가 되며, $out[0]에는 전체패턴내용이, $out[1]에는 서브패턴 매치값이 들어가는데,
전체패턴내용이 2개가 존재하므로 $out[0][0]과 $out[0][1]에 각각 첫번째, 두번째 매치된 전체패턴값이 들어간다.
서브패턴내용 역시 2개가 존재하므로 $out[1][0], $out[1][1]에 각각 첫번재, 두번째 매치된 서브패턴값이 들어간다.

예제) 플래그가 'PREG_SET_ORDER'로 지정되었을때, $matches값의 변화
소스:
<?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

설명:
이전 예제에서는 $out[0]에 전체패턴값이 들어갔지만 여기에서는 첫번째 매치된 배열, 즉 첫번째 전체패턴내용과 첫번재 서브패턴내용이 들어간다.
$out[1]에는 두번째 전체패턴내용과 두번째 서브패턴 내용이 $out[1][0], $out[1][1]에 각각 들어간다.


정리) 위 2가지 예제의 차이점은 도식화 하면 아래와 같다.
$matches[전체패턴:0][매치횟수:0]
:
$matches[전체패턴:0][매치횟수:n]
$matches[서브패턴:1][매치횟수:0]
:
$matches[서브패턴:1][매치횟수:n]

$matches[매치횟수:0][전체패턴:0]
$matches[매치횟수:0][서브패턴:1]

:
$matches[매치횟수:n][전체패턴:0]
$matches[매치횟수:n][서브패턴:1]



다음번엔 실제 많이 사용되는 예제로 정규식을 좀더 알아보도록 하겠습니다.
가시기전에 손가락 한번 클릭해 주세요.
추천  클릭

 

추천 0
게시물 검색