웹마스터 팁

빰빠밤~~~ 제 9강!! 대망의 정규식입니다.
사실 저도 정규식에 대해서 깊은 조예를 가지지 못했기 때문에... 그리 깊이는 못들어갈거예요. 그렇지만 하는데까지는 해보겠다는 각오로~ 불끈~ ^^;;

PHP를 어느정도 사용할 줄 아시는 분들도 정규식을 잘 사용하지 못해서 일부러 머~~~언 길을 돌아가는 경우가 많더군요. 사실 저도 정규식을 본격적으로 이용하기 시작한 건 얼마 안되었습니다만, 쓰면 쓸수록 참 매력적인 넘입니다. 잡설은 그만 하고, 본격적으로 강의에 들어갑니다.


PHP에서 사용하는 정규식의 종류로는 두가지가 있습니다. 하나는 ereg 계열의 함수를 사용하는 POSIX Extended(POSIX 확장)형이고, 또 하나는 preg 계열의 함수를 사용하는 Perl-Compatible(펄 호환) 형입니다. 그 중 우리가 중점적으로 다룰 것은 preg 계열의 Perl-Compatible 정규식입니다. 왜냐하면 이미 많은 사람들에 의해서 속도가 더 빠른 것이 입증되었기 때문이기도 하고, 더 강력한 기능을 가지고 있으니까요.

우선 사용되는 함수의 정의와 간략한 사용법에 대해서 짚고 넘어갑니다.

** preg_grep :  입력받은 배열중 정규식 패턴에 일치하는 부분을 배열로 반환
array preg_grep ( string pattern, array input)
pattern은 정규식의 패턴이고, input 은 검사할 배열입니다.

** preg_match : 입력받은 문자열에 대해서 정규식 패턴이 존재하는지 안하는지 수행
int preg_match ( string pattern, string subject [, array matches [, int flags]])
pattern은 정규식 패턴, subject는 대상 문자열, matches는 일치하는 문자열의 배열입니다. 반환되는 int는 일치하는 문자열이 있다/없다만 알려주는 1과 0만 존재합니다. $matches[0]에는 일치하는 문자열 전체가, $matches[1] 에는 첫번째 괄호에 해당하는 문자열이 나타납니다. 무슨 말인지는 나중에 알게 될테니 그렇구나...하는 것 정도만... ^^

** preg_match_all : 입력받은 문자열에 대해서 정규식 패턴 수행
int preg_match_all ( string pattern, string subject, array matches [, int flags])
반환되는 int는 일치한 갯수입니다. 비슷한 함수인 preg_match와 다른 점이 있다면 preg_match는 해당 패턴에 일치하는 문자열이 있다/없다 만 판별해주며, matches에는 가장 처음 일치한 부분만 저장하게 됩니다. 그러나, preg_match_all 함수는 대상 문자열에서 패턴에 일치하는 문자열을 모조리 뽑아오게 됩니다.

** preg_quote : 정규식 문자에 역슬래시를 붙여서 문자로 인식되게 한다.
string preg_quote ( string str [, string delimiter])
정규식에 쓰이는 몇몇 특정 문자들이 있는데, 이러한 문자들이 혼동되지 않도록 역슬래시 를 붙여서 일반 문자처럼 인식하도록 해줍니다. 나중에 배울 addslashes 와 비슷한 점이 많은 쓰임입니다. delimiter 에는 정규식의 구분자를 사용하는데 예를 들어 "/test/" 와 같은 정규식 패턴이 있다고 하면 여기에서 구분자는 "/" 문자가 됩니다. 물론, "|test|"와 같은 사용도 가능하죠. 구분자가 정규식 중간에 나오면 에러를 발생시키기 때문에( 예 - "/tes/t/" ) 구분자를 지정해주면 이 함수에서 알아서 역슬래시를 붙여줍니다. 지정해주지 않으면 구분자는 검사하지 않고 나머지 부분에 대해서만 역슬래시를 붙입니다. 매뉴얼의 preg_quote 를 보시면 어떤 문자들에 대해서 검사하는지 알 수 있습니다.

** preg_replace : 입력받은 문자열에서 정규식 패턴에 해당하는 문자를 치환해서 반환합니다.
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
replacement 에는 치환할 문자열이 들어갑니다. limit를 지정하면 limit 만큼만 치환을 수행하고 함수를 종료합니다.

** preg_replace_callback : 입력받은 문자열에서 정규식 패턴을 수행하면서 일치하는 패턴이 있으면 callback함수를 통해 치환하고 최종 결과를 반환합니다.
mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit])
callback 에는 callback 함수의 이름이 들어갑니다. 매뉴얼을 보시면 알겠지만 문자열의 형태로 함수를 지정해주고 있습니다. callback 함수는 다음과 같은 형태로 정의합니다.
function 함수명($match)
{
 실행문
 return 결과값;
}

물론, $match는 다른 문자로 치환될 수도 있지만 주의할 것은 $match는 일반 문자열이 아닌 정규식 패턴과 일치하는 문자열의 배열이라는 것입니다. preg_match 에서 쓰인 $match와 비슷한 의미입니다. preg_replace_callback 함수의 동작 순서를 살펴보면 다음과 같습니다.

입력된 문자열에 대해서 정규식 수행 ->일치한다 -> callback 함수 호출 ->일치한 패턴을 callback 함수에서 반환한 값으로 치환 ->다음 부분에 대해서 정규식 수행 ->일치한다 ...중간생략... 입력된 문자열의 끝 -> preg_replace_callback 함수 종료. 치환된 문자열 반환

** preg_split : 주어진 정규식 패턴을 기준으로 입력된 문자열을 나누어 배열로 반환
array preg_split ( string pattern, string subject [, int limit [, int flags]])
이 함수를 설명하기 위해서 split() 함수를 소개하자면, split 함수는 ereg 계열의 함수이며 하는 일은 preg_split 과 같습니다. 다음의 사용법을 보시면,
$str = split(",", "이것은,예제,입니다.");

위의 코드를 실행하게 되면 $str 은 배열로 $str[0] 에는 "이것은", $str[1]에는 "예제", $str[2]에는 "입니다." 라는 문자열이 각각 저장됩니다. 즉 ","를 기준으로 각각을 배열로 나눈 것이죠. preg_split 도 비슷한 일을 행하는데, 다만 펄 호환 정규식을 pattern에 쓴다는 점이 다릅니다.

이걸로 정규식 함수에 대한 간략한 소개가 끝났습니다. 다음 시간에는 정규식을 만드는 법과 더불어서 이 함수들에 관한 실제 사용을 해보도록 하겠습니다.
아마 다음 시간 분량이 꽤 길어질 것 같네요. ^^


## 생각해볼 과제 ##
ereg 계열의 함수에 대해서도 살펴볼 것.
참고. PHP 매뉴얼 Regular Expression Functions (POSIX Extended)