제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.
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
$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 를 반환.
용도 :
특정 패턴의 문자열이 존재하는지 여부를 확인 할때나,
특정 패턴의 문자열을 찾아서 그 문자열을 알고 싶을때 사용합니다
참조란, 쉽게 설명하자면, 특정 변수 앞에 & 를 붙임으로서 사용할 수 있는 것으로써,외부의 변수를 함수의 인자로 받아서 함수 내부에서 변하는 값도 원래의 변수에 반영되는 것을 뜻합니다.
즉, 참조를 사용하면, 특정함수에서 리턴값이 없더라도 참조를 통해 어떤 원하는 결과값을 받을수가 있습니다.
preg_match 의 결과값은 검사를 수행하고 1 이나 false 만을 반환하는데, 세부적인 매치된 내용까지 알기 위해서 자동 참조를 통해서 값을 받는 것입니다.
예제22> test22.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;
?>
결과 :
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 )
이 네번째 인자를 사용하게 되면, 패턴과 매치되는 문자열이 있을 경우 그 문자열과 그 문자열이 처음 위치하는 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;
?>
결과 :
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 ) )
예제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;
?>
결과 :
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로 변환해서 올리다보니 빡십니다.
아마 간혹 그런것이 있을수 있으니 양해 부탁드립니다.
아래 코멘트 감사합니다.
$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;
$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;
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 6030 | 12년 전 | 2821 | ||
| 6029 | 12년 전 | 2849 | ||
| 6028 | 12년 전 | 1475 | ||
| 6027 | 12년 전 | 889 | ||
| 6026 |
kiplayer
|
12년 전 | 800 | |
| 6025 | 12년 전 | 586 | ||
| 6024 | 12년 전 | 2808 | ||
| 6023 | 12년 전 | 2947 | ||
| 6022 |
|
12년 전 | 2102 | |
| 6021 |
Holyreign
|
12년 전 | 1335 | |
| 6020 | 12년 전 | 785 | ||
| 6019 | 12년 전 | 2861 | ||
| 6018 | 12년 전 | 3189 | ||
| 6017 | 12년 전 | 1236 | ||
| 6016 |
kiplayer
|
12년 전 | 10566 | |
| 6015 |
itlang
|
12년 전 | 1415 | |
| 6014 | 12년 전 | 424 | ||
| 6013 |
senseme
|
12년 전 | 1361 | |
| 6012 | 12년 전 | 3108 | ||
| 6011 | 12년 전 | 7121 | ||
| 6010 | 12년 전 | 8959 | ||
| 6009 | 12년 전 | 2862 | ||
| 6008 | 12년 전 | 2989 | ||
| 6007 | 12년 전 | 6670 | ||
| 6006 | 12년 전 | 10513 | ||
| 6005 | 12년 전 | 4046 | ||
| 6004 |
|
12년 전 | 576 | |
| 6003 | 12년 전 | 881 | ||
| 6002 | 12년 전 | 2352 | ||
| 6001 | 12년 전 | 684 | ||
| 6000 |
kiplayer
|
12년 전 | 3735 | |
| 5999 | 12년 전 | 428 | ||
| 5998 |
|
12년 전 | 2940 | |
| 5997 |
|
12년 전 | 3435 | |
| 5996 | 12년 전 | 2094 | ||
| 5995 |
kiplayer
|
12년 전 | 2167 | |
| 5994 |
|
12년 전 | 3263 | |
| 5993 |
windowhan
|
12년 전 | 675 | |
| 5992 | 12년 전 | 2898 | ||
| 5991 | 12년 전 | 5224 | ||
| 5990 | 12년 전 | 1636 | ||
| 5989 |
AMDbest
|
12년 전 | 1343 | |
| 5988 | 12년 전 | 1210 | ||
| 5987 |
kiplayer
|
12년 전 | 1135 | |
| 5986 |
한번잘해보자
|
12년 전 | 924 | |
| 5985 |
kiplayer
|
12년 전 | 3137 | |
| 5984 |
dsv421
|
12년 전 | 802 | |
| 5983 |
dsv421
|
12년 전 | 1507 | |
| 5982 |
dsv421
|
12년 전 | 5835 | |
| 5981 | 12년 전 | 3210 | ||
| 5980 |
MFBob
|
12년 전 | 2611 | |
| 5979 | 12년 전 | 3096 | ||
| 5978 |
AMDbest
|
12년 전 | 1460 | |
| 5977 | 12년 전 | 785 | ||
| 5976 | 12년 전 | 1202 | ||
| 5975 | 12년 전 | 1264 | ||
| 5974 | 12년 전 | 607 | ||
| 5973 |
kiplayer
|
12년 전 | 3539 | |
| 5972 |
kiplayer
|
12년 전 | 3962 | |
| 5971 |
kiplayer
|
12년 전 | 2292 | |
| 5970 |
kiplayer
|
12년 전 | 8288 | |
| 5969 |
kiplayer
|
12년 전 | 944 | |
| 5968 | 12년 전 | 8737 | ||
| 5967 |
|
12년 전 | 16899 | |
| 5966 | 12년 전 | 1223 | ||
| 5965 | 12년 전 | 701 | ||
| 5964 | 12년 전 | 6242 | ||
| 5963 | 12년 전 | 694 | ||
| 5962 | 12년 전 | 881 | ||
| 5961 | 12년 전 | 634 | ||
| 5960 | 12년 전 | 780 | ||
| 5959 |
|
12년 전 | 1123 | |
| 5958 | 12년 전 | 976 | ||
| 5957 |
웹디자인되고파
|
12년 전 | 1082 | |
| 5956 | 12년 전 | 3652 | ||
| 5955 | 12년 전 | 2133 | ||
| 5954 | 12년 전 | 4383 | ||
| 5953 | 12년 전 | 3071 | ||
| 5952 | 12년 전 | 4258 | ||
| 5951 | 12년 전 | 2069 | ||
| 5950 | 12년 전 | 1271 | ||
| 5949 | 12년 전 | 923 | ||
| 5948 | 12년 전 | 2070 | ||
| 5947 | 12년 전 | 4997 | ||
| 5946 |
dsv421
|
12년 전 | 1269 | |
| 5945 |
dsv421
|
12년 전 | 4114 | |
| 5944 |
dsv421
|
12년 전 | 5636 | |
| 5943 | 12년 전 | 1271 | ||
| 5942 | 12년 전 | 2532 | ||
| 5941 |
프로프리랜서
|
12년 전 | 1638 | |
| 5940 |
atria
|
12년 전 | 605 | |
| 5939 | 12년 전 | 2322 | ||
| 5938 | 12년 전 | 2069 | ||
| 5937 |
프로프리랜서
|
12년 전 | 759 | |
| 5936 |
프로프리랜서
|
12년 전 | 710 | |
| 5935 |
프로프리랜서
|
12년 전 | 3204 | |
| 5934 |
프로프리랜서
|
12년 전 | 1620 | |
| 5933 |
AMDbest
|
12년 전 | 636 | |
| 5932 |
AMDbest
|
12년 전 | 497 | |
| 5931 | 12년 전 | 8136 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기