정규표현식 관련 내장함수 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,782
12년 전 조회 5,464
12년 전 조회 3,511
12년 전 조회 1,433
12년 전 조회 1.4만
12년 전 조회 1,289
12년 전 조회 709
12년 전 조회 4,027
12년 전 조회 1,541
12년 전 조회 9,447
12년 전 조회 875
12년 전 조회 1,335
12년 전 조회 3,305
12년 전 조회 940
12년 전 조회 1,856
12년 전 조회 3,763
12년 전 조회 1,172
12년 전 조회 1,055
12년 전 조회 5,399
12년 전 조회 1,523
12년 전 조회 850
12년 전 조회 2,745
12년 전 조회 2,575
12년 전 조회 1,601
12년 전 조회 3,025
12년 전 조회 6,641
12년 전 조회 2,237
12년 전 조회 827
12년 전 조회 2,005
12년 전 조회 1,950
12년 전 조회 2,699
12년 전 조회 699
12년 전 조회 1,787
12년 전 조회 872
12년 전 조회 1,862
12년 전 조회 2,774
12년 전 조회 1,333
12년 전 조회 3,974
12년 전 조회 1만
12년 전 조회 1,197
12년 전 조회 2,534
12년 전 조회 2,216
12년 전 조회 3,077
12년 전 조회 6,116
12년 전 조회 2,728
12년 전 조회 3,059
12년 전 조회 1,064
12년 전 조회 856
12년 전 조회 1,947
12년 전 조회 5,954
12년 전 조회 1,572
12년 전 조회 4,799
12년 전 조회 1,023
12년 전 조회 4,191
12년 전 조회 1,342
12년 전 조회 1,190
12년 전 조회 1,773
12년 전 조회 1,398
12년 전 조회 661
12년 전 조회 633
12년 전 조회 2.1만
12년 전 조회 600
12년 전 조회 1,155
12년 전 조회 1,165
12년 전 조회 1,395
12년 전 조회 3,553
12년 전 조회 795
12년 전 조회 2,300
12년 전 조회 4,971
12년 전 조회 746
13년 전 조회 3,939
13년 전 조회 1,123
13년 전 조회 3,847
13년 전 조회 999
13년 전 조회 1,847
13년 전 조회 1,012
13년 전 조회 2,242
13년 전 조회 8,027
13년 전 조회 2,013
13년 전 조회 1,811
13년 전 조회 1,613
13년 전 조회 684
13년 전 조회 2,198
13년 전 조회 1,920
13년 전 조회 715
13년 전 조회 1,290
13년 전 조회 713
13년 전 조회 984
13년 전 조회 1,273
13년 전 조회 3,670
13년 전 조회 2,191
13년 전 조회 2,390
13년 전 조회 3,754
13년 전 조회 3,564
13년 전 조회 3,225
13년 전 조회 4,087
13년 전 조회 1,109
13년 전 조회 6,061
13년 전 조회 1,463
13년 전 조회 1,295
🐛 버그신고