정규표현식 관련 내장함수 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,737
12년 전 조회 5,411
12년 전 조회 3,463
12년 전 조회 1,384
12년 전 조회 1.4만
12년 전 조회 1,249
12년 전 조회 656
12년 전 조회 3,979
12년 전 조회 1,503
12년 전 조회 9,396
12년 전 조회 829
12년 전 조회 1,287
12년 전 조회 3,262
12년 전 조회 890
12년 전 조회 1,809
12년 전 조회 3,700
12년 전 조회 1,121
12년 전 조회 1,007
12년 전 조회 5,347
12년 전 조회 1,477
12년 전 조회 802
12년 전 조회 2,741
12년 전 조회 2,533
12년 전 조회 1,549
12년 전 조회 2,980
12년 전 조회 6,598
12년 전 조회 2,188
12년 전 조회 785
12년 전 조회 1,951
12년 전 조회 1,904
12년 전 조회 2,650
12년 전 조회 646
12년 전 조회 1,734
12년 전 조회 814
12년 전 조회 1,814
12년 전 조회 2,730
12년 전 조회 1,289
12년 전 조회 3,922
12년 전 조회 1만
12년 전 조회 1,160
12년 전 조회 2,490
12년 전 조회 2,163
12년 전 조회 3,025
12년 전 조회 6,067
12년 전 조회 2,685
12년 전 조회 3,005
12년 전 조회 1,016
12년 전 조회 810
12년 전 조회 1,890
12년 전 조회 5,904
12년 전 조회 1,512
12년 전 조회 4,743
12년 전 조회 973
12년 전 조회 4,141
12년 전 조회 1,287
12년 전 조회 1,144
12년 전 조회 1,725
12년 전 조회 1,358
12년 전 조회 607
12년 전 조회 577
12년 전 조회 2만
12년 전 조회 544
12년 전 조회 1,110
12년 전 조회 1,120
12년 전 조회 1,358
12년 전 조회 3,510
12년 전 조회 745
12년 전 조회 2,244
12년 전 조회 4,922
12년 전 조회 694
12년 전 조회 3,884
12년 전 조회 1,075
12년 전 조회 3,800
12년 전 조회 948
13년 전 조회 1,797
13년 전 조회 968
13년 전 조회 2,192
13년 전 조회 7,973
13년 전 조회 1,962
13년 전 조회 1,762
13년 전 조회 1,571
13년 전 조회 633
13년 전 조회 2,154
13년 전 조회 1,882
13년 전 조회 664
13년 전 조회 1,238
13년 전 조회 654
13년 전 조회 938
13년 전 조회 1,229
13년 전 조회 3,616
13년 전 조회 2,149
13년 전 조회 2,336
13년 전 조회 3,705
13년 전 조회 3,519
13년 전 조회 3,179
13년 전 조회 4,045
13년 전 조회 1,057
13년 전 조회 6,018
13년 전 조회 1,411
13년 전 조회 1,255
🐛 버그신고