제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.
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;
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 6730 |
|
11년 전 | 1109 | |
| 6729 | 11년 전 | 565 | ||
| 6728 |
|
11년 전 | 579 | |
| 6727 | 11년 전 | 2424 | ||
| 6726 | 11년 전 | 598 | ||
| 6725 |
네모웹에이전시
|
11년 전 | 442 | |
| 6724 |
네모웹에이전시
|
11년 전 | 886 | |
| 6723 | 11년 전 | 1020 | ||
| 6722 | 11년 전 | 962 | ||
| 6721 | 11년 전 | 648 | ||
| 6720 | 11년 전 | 1977 | ||
| 6719 | 11년 전 | 2199 | ||
| 6718 | 11년 전 | 1103 | ||
| 6717 |
|
11년 전 | 660 | |
| 6716 | 11년 전 | 2311 | ||
| 6715 | 11년 전 | 7580 | ||
| 6714 | 11년 전 | 2049 | ||
| 6713 | 11년 전 | 782 | ||
| 6712 |
geektoo
|
11년 전 | 1158 | |
| 6711 | 11년 전 | 900 | ||
| 6710 |
sirzzang
|
11년 전 | 2130 | |
| 6709 |
bewitched
|
11년 전 | 1801 | |
| 6708 |
levin
|
11년 전 | 570 | |
| 6707 | 11년 전 | 768 | ||
| 6706 | 11년 전 | 1798 | ||
| 6705 | 11년 전 | 992 | ||
| 6704 |
|
11년 전 | 758 | |
| 6703 | 11년 전 | 417 | ||
| 6702 | 11년 전 | 1100 | ||
| 6701 | 11년 전 | 806 | ||
| 6700 | 11년 전 | 1721 | ||
| 6699 | 11년 전 | 716 | ||
| 6698 |
이박사친구
|
11년 전 | 730 | |
| 6697 | 11년 전 | 1219 | ||
| 6696 | 11년 전 | 620 | ||
| 6695 |
Header
|
11년 전 | 707 | |
| 6694 | 11년 전 | 1164 | ||
| 6693 |
|
11년 전 | 1115 | |
| 6692 | 11년 전 | 1151 | ||
| 6691 | 11년 전 | 1289 | ||
| 6690 |
|
11년 전 | 717 | |
| 6689 | 11년 전 | 896 | ||
| 6688 | 11년 전 | 935 | ||
| 6687 | 11년 전 | 535 | ||
| 6686 |
RGB255
|
11년 전 | 964 | |
| 6685 |
|
11년 전 | 640 | |
| 6684 | 11년 전 | 720 | ||
| 6683 | 11년 전 | 387 | ||
| 6682 | 11년 전 | 1131 | ||
| 6681 | 11년 전 | 1420 | ||
| 6680 | 11년 전 | 454 | ||
| 6679 |
RGB255
|
11년 전 | 397 | |
| 6678 | 11년 전 | 1352 | ||
| 6677 |
|
11년 전 | 444 | |
| 6676 | 11년 전 | 1018 | ||
| 6675 |
디자이너필이
|
11년 전 | 827 | |
| 6674 | 11년 전 | 1242 | ||
| 6673 | 11년 전 | 1315 | ||
| 6672 | 11년 전 | 6031 | ||
| 6671 | 11년 전 | 1340 | ||
| 6670 |
하프의정령
|
11년 전 | 573 | |
| 6669 | 11년 전 | 414 | ||
| 6668 |
공부하고가겠슴다
|
11년 전 | 452 | |
| 6667 |
하프의정령
|
11년 전 | 550 | |
| 6666 | 11년 전 | 790 | ||
| 6665 | 12년 전 | 1414 | ||
| 6664 | 12년 전 | 930 | ||
| 6663 | 12년 전 | 1157 | ||
| 6662 | 12년 전 | 412 | ||
| 6661 |
basketball
|
12년 전 | 507 | |
| 6660 | 12년 전 | 2510 | ||
| 6659 | 12년 전 | 1612 | ||
| 6658 |
|
12년 전 | 1336 | |
| 6657 |
|
12년 전 | 3160 | |
| 6656 | 12년 전 | 566 | ||
| 6655 |
프로프리랜서
|
12년 전 | 2334 | |
| 6654 |
프로프리랜서
|
12년 전 | 1912 | |
| 6653 |
프로프리랜서
|
12년 전 | 1746 | |
| 6652 |
프로프리랜서
|
12년 전 | 1831 | |
| 6651 |
|
12년 전 | 784 | |
| 6650 | 12년 전 | 1317 | ||
| 6649 | 12년 전 | 1318 | ||
| 6648 | 12년 전 | 813 | ||
| 6647 | 12년 전 | 3162 | ||
| 6646 | 12년 전 | 471 | ||
| 6645 | 12년 전 | 966 | ||
| 6644 |
BBAYOUNG
|
12년 전 | 1380 | |
| 6643 | 12년 전 | 1793 | ||
| 6642 | 12년 전 | 643 | ||
| 6641 | 12년 전 | 1333 | ||
| 6640 | 12년 전 | 707 | ||
| 6639 | 12년 전 | 2321 | ||
| 6638 |
jasmin2
|
12년 전 | 753 | |
| 6637 |
geektoo
|
12년 전 | 447 | |
| 6636 | 12년 전 | 667 | ||
| 6635 |
프로프리랜서
|
12년 전 | 2235 | |
| 6634 |
프로프리랜서
|
12년 전 | 1743 | |
| 6633 |
프로프리랜서
|
12년 전 | 4060 | |
| 6632 |
프로프리랜서
|
12년 전 | 1348 | |
| 6631 |
프로프리랜서
|
12년 전 | 1783 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기