정규표현식 관련 내장함수 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,736
12년 전 조회 5,410
12년 전 조회 3,462
12년 전 조회 1,383
12년 전 조회 1.4만
12년 전 조회 1,247
12년 전 조회 655
12년 전 조회 3,978
12년 전 조회 1,502
12년 전 조회 9,396
12년 전 조회 828
12년 전 조회 1,285
12년 전 조회 3,261
12년 전 조회 890
12년 전 조회 1,807
12년 전 조회 3,698
12년 전 조회 1,119
12년 전 조회 1,006
12년 전 조회 5,344
12년 전 조회 1,475
12년 전 조회 801
12년 전 조회 2,741
12년 전 조회 2,531
12년 전 조회 1,549
12년 전 조회 2,980
12년 전 조회 6,595
12년 전 조회 2,187
12년 전 조회 783
12년 전 조회 1,950
12년 전 조회 1,901
12년 전 조회 2,647
12년 전 조회 643
12년 전 조회 1,734
12년 전 조회 814
12년 전 조회 1,813
12년 전 조회 2,729
12년 전 조회 1,288
12년 전 조회 3,921
12년 전 조회 1만
12년 전 조회 1,158
12년 전 조회 2,489
12년 전 조회 2,160
12년 전 조회 3,024
12년 전 조회 6,066
12년 전 조회 2,682
12년 전 조회 3,004
12년 전 조회 1,014
12년 전 조회 809
12년 전 조회 1,890
12년 전 조회 5,902
12년 전 조회 1,511
12년 전 조회 4,742
12년 전 조회 972
12년 전 조회 4,139
12년 전 조회 1,285
12년 전 조회 1,143
12년 전 조회 1,723
12년 전 조회 1,358
12년 전 조회 606
12년 전 조회 576
12년 전 조회 2만
12년 전 조회 542
12년 전 조회 1,109
12년 전 조회 1,118
12년 전 조회 1,358
12년 전 조회 3,507
12년 전 조회 738
12년 전 조회 2,241
12년 전 조회 4,922
12년 전 조회 692
12년 전 조회 3,883
12년 전 조회 1,074
12년 전 조회 3,800
12년 전 조회 948
13년 전 조회 1,795
13년 전 조회 967
13년 전 조회 2,191
13년 전 조회 7,972
13년 전 조회 1,961
13년 전 조회 1,760
13년 전 조회 1,571
13년 전 조회 632
13년 전 조회 2,153
13년 전 조회 1,881
13년 전 조회 664
13년 전 조회 1,235
13년 전 조회 652
13년 전 조회 937
13년 전 조회 1,227
13년 전 조회 3,614
13년 전 조회 2,147
13년 전 조회 2,334
13년 전 조회 3,702
13년 전 조회 3,516
13년 전 조회 3,175
13년 전 조회 4,042
13년 전 조회 1,055
13년 전 조회 6,017
13년 전 조회 1,409
13년 전 조회 1,253
🐛 버그신고