정규표현식 관련 내장함수 preg_grep, preg_match

대단할것은 없는 강좌이지만,
제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.

강좌는 php 5. 대를 기준으로 하며, PCRE (펄과 호환 되는 정규표현식)을 다룹니다.
PCRE 는 preg_ 로 시작되는 내장함수와 함께 사용되어지는 정규표현식을 말합니다.

PCRE > 정규표현식 관련 내장함수 preg_grep, preg_match

이전 내용에서는 정규표현식의 패턴변경자 i, m, s 에 대하여 알아보았습니다.
이번 내용에서는 다음 패턴변경자를 다루기 전에 내장함수 preg_grep 과 preg_match 에 대해서 알아보겠습니다 .

array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )

설명 : 입력받은 문자열 배열 중 에서 주어진 패턴과 매치되는 배열의 원소를 배열 로 다시 돌려줍니다.

인자 :
    -> string $pattern : 문자열로 된 정규 표현식 패턴
    -> array $input : 문자열 배열
    -> int $flags : 생략가능하며, PREG_GREP_INVERT (1) 상수와 같이 사용할수 있음

결과값 :
    패턴과 일치하는 배열의 원소를 원래의 키와 값을 사용한 배열로 돌려줍니다.
    일치하는 것이 없을 경우에는 빈배열 Array()를 다시 돌려줍니다.
    단, $falgs 의 값이 1 일 경우에는 반대로 동작합니다.
    즉, 일치하지 않는 배열의 원소를 배열로 돌려줍니다.

용도 :
    동일한 패턴을 가지는 여러 문자열을 배열로 받아서 패턴과 일치 여부를 판단할때,
    예를 들면, 관리자 리스트 같은 곳에서 여러개의 값을 선택하여 넘어왔을 경우,
    그 넘어온값을 한꺼번에 체크할때 같은 경우에 사용할수 있습니다.

예제21> test21.php

<?php

$ids = Array() ;
$ids[] = 'dbckdghk' ;
$ids['a'] = 'dbckdghk1' ;
$ids[] = 'dbckdghk1_' ;
$ids[] = 'dbckdghkdbckdghk' ; // 16자
$ids['b'] = 'DBCKDGHK' ;
$ids[] = 'dbc' ; // 3자
$ids['c'] = 'DbCKdGHk1_' ;
$ids[] = 'dbckdghk&' ; // _ 이외의 특수 문자
$ids['가'] = '유창화' ; // 한글

echo "입력받은 원래 배열 : <br>" . PHP_EOL;

print_r($ids);

echo "<br><br>" . PHP_EOL;

// 영어 알파벳(대소문자 구분없음), 숫자, _ 만 사용 가능하며, 4자이상 10자 이하
$return = preg_grep("`^[0-9a-z_]{4,10}$`i", $ids) // $flags default 0 사용

echo "\$flags default 0 사용 : <br>" . PHP_EOL;

print_r($return);

echo "<br><br>" . PHP_EOL;

// 영어 알파벳(대소문자 구분없음), 숫자, _ 만 사용 가능하며, 4자이상 10자 이하
$return = preg_grep("`^[0-9a-z_]{4,10}$`i", $ids, 1)// $flags 1 사용

echo "\$flags 1 사용 : <br>" . PHP_EOL;

print_r($return);

echo "<br><br>" . PHP_EOL;

?>


결과 :

입력받은 원래 배열 :
Array ( [0] => dbckdghk [a] => dbckdghk1 [1] => dbckdghk1_ [2] => dbckdghkdbckdghk [b] => DBCKDGHK [3] => dbc [c] => DbCKdGHk1_ [4] => dbckdghk& [가] => 유창화 )

$flags default 0 사용 :
Array ( [0] => dbckdghk [a] => dbckdghk1 [1] => dbckdghk1_ [b] => DBCKDGHK [c] => DbCKdGHk1_ )

$flags 1 사용 :
Array ( [2] => dbckdghkdbckdghk [3] => dbc [4] => dbckdghk& [가] => 유창화 )



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

설명 : 입력받은 문자열이 주어진 패턴과 일치하는 검사

인자 :
    -> string $pattern : 문자열로 된 정규 표현식 패턴
    -> string $subject : 검사하고자 하는 문자열
    -> array &$matches : 생략 가능하며, 사용시 패턴에 매치되는 내용을 $matches 배열에 담아줌
    -> int $flags : 생략가능하며, PREG_OFFSET_CAPTURE (256) 상수와 같이 사용할수 있음
    -> int $offset : 생략가능하며, 검사 시작 지점을 지정할수 있음

결과값 :
    패턴과 매치되는 문자열을 찾았을 때는 1 을 반환, 못 찾았을 때는 false 를 반환.

용도 :
    특정 패턴의 문자열이 존재하는지 여부를 확인 할때나,
    특정 패턴의 문자열을 찾아서 그 문자열을 알고 싶을때 사용합니다

※ 세번째 인자의 경우 &$matches 라고 되어있는데, 이것은 세번째 인자로 어떤 변수가 주어지면 자동으로 참조 하겠다는 뜻 입니다.
참조란, 쉽게 설명하자면, 특정 변수 앞에 & 를 붙임으로서 사용할 수 있는 것으로써,외부의 변수를 함수의 인자로 받아서 함수 내부에서 변하는 값도 원래의 변수에 반영되는 것을 뜻합니다.
즉, 참조를 사용하면, 특정함수에서 리턴값이 없더라도 참조를 통해 어떤 원하는 결과값을 받을수가 있습니다.
preg_match 의 결과값은 검사를 수행하고 1 이나 false 만을 반환하는데, 세부적인 매치된 내용까지 알기 위해서 자동 참조를 통해서 값을 받는 것입니다.


예제22> test22.php

<?php

// 함수에서 자동 참조 사용
function test_function(&$a){

    $a = 5 ;
}

$b = 10 ;

echo "원래의 \$b 값은 : " . $b . " <br>" . PHP_EOL;

test_function($b);

echo "test_function(\$b); 를 실행한 이후의 \$b 값은 : " . $b . " <br><br>" . PHP_EOL;



function test_function2($a){

    $a = 5 ;
}

$b = 10 ;

echo "원래의 \$b 값은 : " . $b . " <br>" . PHP_EOL;

test_function2($b);

echo "test_function2(\$b); 를 실행한 이후의 \$b 값은 : " . $b . " <br>" . PHP_EOL;

test_function2(&$b); // 사용자가 사용시 참조 사용

echo "test_function2(&\$b); 를 실행한 이후의 \$b 값은 : " . $b . " <br><br>" . PHP_EOL;



// 배열 자동 참조
function test_function3(&$a=Array()){

    $a = array('c', 'd', 'f') ;
}

$b = Array('a','b','c') ;
$c = 'abc' ;
$d = '' ;

echo "원래의 \$b 값은 : ";
print_r($b);
echo " <br>" . PHP_EOL;

test_function3($b);

echo "test_function3(\$b); 를 실행한 이후의 \$b 값은 : ";
print_r($b);
echo " <br><br>" . PHP_EOL;

echo "원래의 \$c 값은 : ";
echo $c;
echo " <br>" . PHP_EOL;

test_function3($c);

echo "test_function3(\$c); 를 실행한 이후의 \$c 값은 : ";
print_r($c);
echo " <br><br>" . PHP_EOL;

echo "원래의 \$d 값은 : ";
echo $d;
echo " <br>" . PHP_EOL;

test_function3($d);

echo "test_function3(\$d); 를 실행한 이후의 \$d 값은 : ";
print_r($d);
echo " <br><br>" . PHP_EOL;

?>


결과 :

원래의 $b 값은 : 10
test_function($b); 를 실행한 이후의 $b 값은 : 5

원래의 $b 값은 : 10
test_function2($b); 를 실행한 이후의 $b 값은 : 10
test_function2(&$b); 를 실행한 이후의 $b 값은 : 5

원래의 $b 값은 : Array ( [0] => a [1] => b [2] => c )
test_function3($b); 를 실행한 이후의 $b 값은 : Array ( [0] => c [1] => d [2] => f )

원래의 $c 값은 : abc
test_function3($c); 를 실행한 이후의 $c 값은 : Array ( [0] => c [1] => d [2] => f )

원래의 $d 값은 :
test_function3($d); 를 실행한 이후의 $d 값은 : Array ( [0] => c [1] => d [2] => f )


※ 네번째 인자 int $flags 에는 숫자 256 을 넣어도 되고 내장 상수 PREG_OFFSET_CAPTURE 를 쓸수 있습니다. 둘다 같은 의미입니다.
이 네번째 인자를 사용하게 되면, 패턴과 매치되는 문자열이 있을 경우 그 문자열과 그 문자열이 처음 위치하는 offset (위치) 를 같이 세번째 인자 배열에 저장합니다.


예제23> test23.php

<?

$subject = "abcdef" ;
$pattern = '/def/' ;

preg_match($pattern, $subject, $matches);

echo "preg_match('$pattern', '$subject', \$matches); 를 실행한 이후의 \$matches 값은 : ";
echo " <br>" . PHP_EOL;
print_r($matches);
echo " <br><br>" . PHP_EOL;

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); // 매치되는 문자열의 시작 위치를 같이 $matches 에 저장

echo "preg_match('$pattern', '$subject', \$matches, PREG_OFFSET_CAPTURE); 를 실행한 이후의 \$matches 값은 : ";
echo " <br>" . PHP_EOL;
print_r($matches);
echo " <br><br>" . PHP_EOL;



// 서브 패턴이 포함 되었을 때의 결과
$pattern = '/d(ef)/';

preg_match($pattern, $subject, $matches);

echo "preg_match('$pattern', '$subject', \$matches); 를 실행한 이후의 \$matches 값은 : ";
echo " <br>" . PHP_EOL;
print_r($matches);
echo " <br><br>" . PHP_EOL;

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); // 매치되는 문자열의 시작 위치를 같이 $matches 에 저장

echo "preg_match('$pattern', '$subject', \$matches, PREG_OFFSET_CAPTURE); 를 실행한 이후의 \$matches 값은 : ";
echo " <br>" . PHP_EOL;
print_r($matches);
echo " <br><br>" . PHP_EOL;

?>


결과 :

preg_match('/def/', 'abcdef', $matches); 를 실행한 이후의 $matches 값은 :
Array ( [0] => def )

preg_match('/def/', 'abcdef', $matches, PREG_OFFSET_CAPTURE); 를 실행한 이후의 $matches 값은 :
Array ( [0] => Array ( [0] => def [1] => 3 ) )

preg_match('/d(ef)/', 'abcdef', $matches); 를 실행한 이후의 $matches 값은 :
Array ( [0] => def [1] => ef )

preg_match('/d(ef)/', 'abcdef', $matches, PREG_OFFSET_CAPTURE); 를 실행한 이후의 $matches 값은 :
Array ( [0] => Array ( [0] => def [1] => 3 ) [1] => Array ( [0] => ef [1] => 4 ) )



※ 다섯번째 인자 int $offset 은 입력받은 패턴으로 검사를 수행할 시작 위치를 지정합니다.


예제24> test24.php

<?

$subject = "abcdef" ;
$pattern = '/d(ef)/' ;

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 2);

echo "preg_match('$pattern', '$subject', \$matches, PREG_OFFSET_CAPTURE, 2); 를 실행한 이후의 \$matches 값은 : ";
echo " <br>" . PHP_EOL;
print_r($matches);
echo " <br><br>" . PHP_EOL;

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);

echo "preg_match('$pattern', '$subject', \$matches, PREG_OFFSET_CAPTURE, 3); 를 실행한 이후의 \$matches 값은 : ";
echo " <br>" . PHP_EOL;
print_r($matches);
echo " <br><br>" . PHP_EOL;

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 4);

echo "preg_match('$pattern', '$subject', \$matches, PREG_OFFSET_CAPTURE, 4); 를 실행한 이후의 \$matches 값은 : ";
echo " <br>" . PHP_EOL;
print_r($matches);
echo " <br><br>" . PHP_EOL;

?>


결과 :

preg_match('/d(ef)/', 'abcdef', $matches, PREG_OFFSET_CAPTURE, 2); 를 실행한 이후의 $matches 값은 :
Array ( [0] => Array ( [0] => def [1] => 3 ) [1] => Array ( [0] => ef [1] => 4 ) )

preg_match('/d(ef)/', 'abcdef', $matches, PREG_OFFSET_CAPTURE, 3); 를 실행한 이후의 $matches 값은 :
Array ( [0] => Array ( [0] => def [1] => 3 ) [1] => Array ( [0] => ef [1] => 4 ) )

preg_match('/d(ef)/', 'abcdef', $matches, PREG_OFFSET_CAPTURE, 4); 를 실행한 이후의 $matches 값은 :
Array ( )

|

댓글 19개

예제가 충분한 설명이 되므로 기타 설명은 제외했습니다.
감사합니다.~~~
그래 일등이네 고마워.
감사합니다 ^^
고맙습니다 ^^
약먹은 기운에 몽롱해서 다음날 다시 봐야 겠습니다....ㅠㅠ
네에 몸이 먼저지요.. 고맙습니다.
감사합니다.꾸벅
고맙습니다. 꾸벅
저는 약을 안 먹었는데도 다시 봐야 되겠습니다. ^^
감사합니다.
ㅎㅎ 네
감사합니다.
감사합니다 ^^
주소값에서 뭔가 추출할때 많이 씁니다 ㅎㅎㅎ
ㅎㅎ 그래. 고마워
예제에 줄바꿈부분에 뭐가 있어서 그런건지
드래그해서 에딧플러스로 저장하니 에러나네요 ㅜ.ㅜ
혹시 저같은분 계실까봐 아래에 올려놨습니당 ^^
네에 감사합니다.

소스를 html로 변환해서 올리다보니 빡십니다.
아마 간혹 그런것이 있을수 있으니 양해 부탁드립니다.

아래 코멘트 감사합니다.
< 예제 21 >

$ids = Array() ;
$ids[] = 'dbckdghk' ;
$ids['a'] = 'dbckdghk1' ;
$ids[] = 'dbckdghk1_' ;
$ids[] = 'dbckdghkdbckdghk' ; // 16자
$ids['b'] = 'DBCKDGHK' ;
$ids[] = 'dbc' ; // 3자
$ids['c'] = 'DbCKdGHk1_' ;
$ids[] = 'dbckdghk&' ; // _ 이외의 특수 문자
$ids['가'] = '유창화' ; // 한글

echo "입력받은 원래 배열 : <br>" . PHP_EOL;

print_r($ids);

echo "<br><br>" . PHP_EOL;

// 영어 알파벳(대소문자 구분없음), 숫자, _ 만 사용 가능하며, 4자이상 10자 이하
$return = preg_grep("`^[0-9a-z_]{4,10}$`i", $ids) ; // $flags default 0 사용

echo "$flags default 0 사용 : <br>" . PHP_EOL;

print_r($return);

echo "<br><br>" . PHP_EOL;

// 영어 알파벳(대소문자 구분없음), 숫자, _ 만 사용 가능하며, 4자이상 10자 이하

$return = preg_grep("`^[0-9a-z_]{4,10}$`i", $ids, 1) ; // $flags 1 사용

echo "$flags 1 사용 : <br>" . PHP_EOL;

print_r($return);

echo "<br><br>" . PHP_EOL;
< 예제 23 >

$subject = "abcdef" ;
$pattern = '/def/' ;

preg_match($pattern, $subject, $matches);

echo "preg_match('$pattern', '$subject', \$matches); 를 실행한 이후의 \$matches 값은 : ";

echo " <br>" . PHP_EOL;

print_r($matches);

echo " <br><br>" . PHP_EOL;

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); // 매치되는 문자열의 시작 위치를 같이 $matches 에 저장

echo "preg_match('$pattern', '$subject', \$matches, PREG_OFFSET_CAPTURE); 를 실행한 이후의 \$matches 값은 : ";

echo " <br>" . PHP_EOL;

print_r($matches);

echo " <br><br>" . PHP_EOL;


// 서브 패턴이 포함 되었을 때의 결과

$pattern = '/d(ef)/';

preg_match($pattern, $subject, $matches);

echo "preg_match('$pattern', '$subject', \$matches); 를 실행한 이후의 \$matches 값은 : ";

echo " <br>" . PHP_EOL;

print_r($matches);

echo " <br><br>" . PHP_EOL;


preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); // 매치되는 문자열의 시작 위치를 같이 $matches 에 저장

echo "preg_match('$pattern', '$subject', \$matches, PREG_OFFSET_CAPTURE); 를 실행한 이후의 \$matches 값은 : ";


echo " <br>" . PHP_EOL;

print_r($matches);

echo " <br><br>" . PHP_EOL;
감사합니다.
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
12년 전 조회 2,746
12년 전 조회 5,425
12년 전 조회 3,472
12년 전 조회 1,396
12년 전 조회 1.4만
12년 전 조회 1,259
12년 전 조회 672
12년 전 조회 3,993
12년 전 조회 1,516
12년 전 조회 9,405
12년 전 조회 840
12년 전 조회 1,301
12년 전 조회 3,273
12년 전 조회 903
12년 전 조회 1,821
12년 전 조회 3,721
12년 전 조회 1,133
12년 전 조회 1,018
12년 전 조회 5,364
12년 전 조회 1,495
12년 전 조회 813
12년 전 조회 2,741
12년 전 조회 2,548
12년 전 조회 1,566
12년 전 조회 2,996
12년 전 조회 6,606
12년 전 조회 2,202
12년 전 조회 798
12년 전 조회 1,962
12년 전 조회 1,912
12년 전 조회 2,670
12년 전 조회 664
12년 전 조회 1,747
12년 전 조회 830
12년 전 조회 1,827
12년 전 조회 2,745
12년 전 조회 1,301
12년 전 조회 3,935
12년 전 조회 1만
12년 전 조회 1,168
12년 전 조회 2,503
12년 전 조회 2,178
12년 전 조회 3,047
12년 전 조회 6,087
12년 전 조회 2,701
12년 전 조회 3,022
12년 전 조회 1,032
12년 전 조회 826
12년 전 조회 1,906
12년 전 조회 5,923
12년 전 조회 1,527
12년 전 조회 4,754
12년 전 조회 985
12년 전 조회 4,156
12년 전 조회 1,303
12년 전 조회 1,163
12년 전 조회 1,739
12년 전 조회 1,367
12년 전 조회 628
12년 전 조회 592
12년 전 조회 2만
12년 전 조회 560
12년 전 조회 1,119
12년 전 조회 1,134
12년 전 조회 1,369
12년 전 조회 3,523
12년 전 조회 761
12년 전 조회 2,267
12년 전 조회 4,936
12년 전 조회 705
12년 전 조회 3,898
12년 전 조회 1,086
12년 전 조회 3,815
12년 전 조회 964
13년 전 조회 1,812
13년 전 조회 979
13년 전 조회 2,203
13년 전 조회 7,992
13년 전 조회 1,977
13년 전 조회 1,777
13년 전 조회 1,580
13년 전 조회 641
13년 전 조회 2,173
13년 전 조회 1,892
13년 전 조회 684
13년 전 조회 1,248
13년 전 조회 670
13년 전 조회 954
13년 전 조회 1,244
13년 전 조회 3,630
13년 전 조회 2,159
13년 전 조회 2,349
13년 전 조회 3,717
13년 전 조회 3,531
13년 전 조회 3,192
13년 전 조회 4,055
13년 전 조회 1,070
13년 전 조회 6,034
13년 전 조회 1,433
13년 전 조회 1,267
🐛 버그신고