정규표현식 관련 내장함수 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,802
12년 전 조회 5,485
12년 전 조회 3,532
12년 전 조회 1,453
12년 전 조회 1.4만
12년 전 조회 1,314
12년 전 조회 726
12년 전 조회 4,046
12년 전 조회 1,565
12년 전 조회 9,466
12년 전 조회 897
12년 전 조회 1,352
12년 전 조회 3,339
12년 전 조회 962
12년 전 조회 1,879
12년 전 조회 3,780
12년 전 조회 1,190
12년 전 조회 1,085
12년 전 조회 5,417
12년 전 조회 1,548
12년 전 조회 874
12년 전 조회 2,752
12년 전 조회 2,600
12년 전 조회 1,628
12년 전 조회 3,038
12년 전 조회 6,660
12년 전 조회 2,256
12년 전 조회 853
12년 전 조회 2,026
12년 전 조회 1,977
12년 전 조회 2,726
12년 전 조회 725
12년 전 조회 1,806
12년 전 조회 900
12년 전 조회 1,882
12년 전 조회 2,803
12년 전 조회 1,363
12년 전 조회 3,993
12년 전 조회 1만
12년 전 조회 1,228
12년 전 조회 2,560
12년 전 조회 2,238
12년 전 조회 3,101
12년 전 조회 6,133
12년 전 조회 2,757
12년 전 조회 3,081
12년 전 조회 1,088
12년 전 조회 878
12년 전 조회 1,969
12년 전 조회 5,977
12년 전 조회 1,590
12년 전 조회 4,823
12년 전 조회 1,051
12년 전 조회 4,215
12년 전 조회 1,357
12년 전 조회 1,214
12년 전 조회 1,798
12년 전 조회 1,422
12년 전 조회 691
12년 전 조회 661
12년 전 조회 2.1만
12년 전 조회 624
12년 전 조회 1,176
12년 전 조회 1,187
12년 전 조회 1,421
12년 전 조회 3,585
12년 전 조회 816
12년 전 조회 2,324
12년 전 조회 5,005
13년 전 조회 771
13년 전 조회 3,961
13년 전 조회 1,144
13년 전 조회 3,872
13년 전 조회 1,021
13년 전 조회 1,865
13년 전 조회 1,033
13년 전 조회 2,260
13년 전 조회 8,056
13년 전 조회 2,035
13년 전 조회 1,832
13년 전 조회 1,639
13년 전 조회 705
13년 전 조회 2,217
13년 전 조회 1,944
13년 전 조회 734
13년 전 조회 1,310
13년 전 조회 738
13년 전 조회 1,017
13년 전 조회 1,297
13년 전 조회 3,685
13년 전 조회 2,220
13년 전 조회 2,416
13년 전 조회 3,775
13년 전 조회 3,591
13년 전 조회 3,249
13년 전 조회 4,112
13년 전 조회 1,135
13년 전 조회 6,091
13년 전 조회 1,489
13년 전 조회 1,319
🐛 버그신고