728x90

정규표현식을 제대로 사용할 수 있다면 대부분의 환경에서 어떤 데이터라도 떡 주무르듯이 다룰 수 있다.

(To master regular expressions is to master your data.)

 

정규표현식 : 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 검색하거나 치환하는 과정을 쉽게 처리할 수 있도록 하는 방법이다.

간단한 패턴부터 매우 복잡한 패턴에 이르기까지, 텍스트에서 패턴을 검색하고 찾아내는 것이 정규표현식의 핵심이다.

 

정규표현식과 관련있는 PHP 내장함수

preg_replace("패턴" , "바꿀 패턴" , "바꿀 문장");

 

preg_match("패턴","추출할 문장","결과 배열");

 

preg_match_all("패턴", "추출할 문장", "결과 배열");

 

preg_split("패턴", "추출할 문장");

 

preg_match - 첫번째 매치가 일어나면 실행을 중지한다. (즉, 최대 매치횟수는 1회)

pattern 에 주어진 정규표현식을 해당 문자열에서 찾는다.

패턴에 매치되면 1, 그렇지 않으면 0 을 반환한다. 1인 이유는 처음 매치 후에 검색을 중지하기 때문이다.

 

 

preg_match_all - 전체 매치된 횟수를 반환하며, 오류시 FALSE를 반환한다.

 

substr($원본문자열, $찾을위치, $길이)
 -  $원본문자열에서 $찾을위치의 인덱스(0 시작점)부터 $길이(개수) 만큼의 문자열을 잘라서 반환

 

정규식에서 사용하는 주요 기호
^ : 시작 (바로 뒤의 문자열로 시작되는 것을 의미)

$ : 마지막 글자 (앞의 문자열로 끝나는 것을 의미)

\d : 숫자

\D : 숫자가 아닌 경우, 즉 영문자, 공백, 구두점, 인용부호, 하이픈, 슬래시, 대괄호 등

\w : 영문자와 숫자, _

\W : 영문자와 숫자가 아닌 경우

\s : 공백문자

\S : 공백을 제외한 모든 문자. 즉 [^ \t\r\n] 또는 [^\s] 와 같다.

\t : 탭(tab)

\n : 개행문자

\r : 캐리지 리턴

| : OR 의 의미

\ : 특수문자 앞에서 특수문자 사용을 제외

[] : 문자 종류, 문자 범위 ← 메타문자

() : 문자를 그룹으로 묶음

 

{} : 반복횟수 ← 메타문자

* : 바로 앞의 문자가 최소 0회 이상 반복

+ : 바로 앞의 문자가 최소 1회 이상 반복

.  : 정확히 1개문자 매칭. 줄바꿈 문자를 제외한 모든 단일 문자.  \. 은 점(.)은 문자상수를 의미

? : 바로 앞의 문자가 0 또는 1개 문자 매칭

 

m{n} : m이 연속으로 n회 나오는 경우

m{n1, n2} : m이 n1 ~ n2회 나오는 경우

m{n,} : m 이 n회 이상 나오는 경우

 

5{3,5} : 숫자 5가 세번, 네번, 다섯 번 연속해서 등장한 경우를 찾는다. 

 

플래그(패턴 수식자)
g : 전역매칭
i : 대소문자 무시. 매칭시 알파벳의 대문자와 소문자를 구별하지 않는다.
m : 여러 줄 매칭. 줄 단위로 매칭을 진행한다.

u : 패턴 문자열을 UTF-8 인코딩으로 취급한다.

 

Perl 호환의 정규 표현식 함수는 문자 인코딩이 UTF-8 이면 u 수식자를 지정해서 정확하게 매칭할 수 있지만, UTF-8 이외의 문자는 정확하게 취급할 수 없다.

UTF-8 이외의 문자 인코딩이 정규 표현식에 매칭하려면 mb_ereg()함수 등의 멀티바이트에 대응하는 mbstring 정규 표현식 함수를 사용해야 한다.

처리하는 문자열의 인코딩이 UTF-8로 통일되어 있으면 Perl 호환의 정규 표현식 함수만 사용해도 문제가 없다.

 

[0-9] : 0부터 9까지의 숫자를 찾아라.

[^0-9] : 0부터 9까지의 숫자를 제외하고 찾아라. [^\d] 와 같은 의미다.

[01589] : 0,1,5,8,9 만 찾아라.
\d{3} : 숫자 3개를 찾아라.
-? : 하이픈(-)이 하나 이하 있다.
[.-] : 1개 또는 점(.) 또는 하이픈(-)을 찾아라

 

찾고자 하는 패턴의 전체 또는 일부분을 괄호를 사용해서 그룹으로 묶어 놓으면, 그  내용이 임시로 메모리에 저장된다. $1 또는 \1 은 첫 번째 참조 그룹을 의미하고 $2 또는 \2는 두번째 참조 그룹을 의미한다.

정규식에서 괄호()를 사용하면 순서대로 $1, $2, $3, ... 와 같이 불러서 사용 할 수 있다.
(^02.{0}|^01.{1}|[0-9]{3})
  - ^02.{0}   : ^는 정규식에서 시작을 의미하며 "02"로 시작 하는 경우를 말한다.
  -  "."은 문자 하나를 나타내는데 바로 뒤 괄호가 {0}이니 결과로는 "02"만 추출 한다는 내용
  - ^01.{1}   : 위와 마찬가지로 "01"로 시작하는 경우
  - .{1} 이므로 이후 1자리만 추출 즉 01X 로 시작하는 휴대폰을 의미

([0-9]{4}) : 바로 0-9까지의 숫자를 4자리 가져온다.

 

$str = preg_replace("/\s{2,}/", " ", $str); // s(공백문자)가 2회 이상 나오는 경우를 " " 로 변경

정규식을 만들 경우 원하는 결과가 나오는지 테스트해보고 싶다면

https://regexr.com/  또는

http://www.phpliveregex.com/p/6ik 에서 하면 된다.

 

http://www.slideshare.net/ 에서 검색어에 '정규식'을 입력하면 자바스크립트 정규식에 대한 좋은 자료가 나온다.

 

전화번호에 하이픈(-)을 넣어서 보기 좋게 정렬을 할 필요가 있을 경우 아래 함수를 이용하면 편하다.

 

<?php
// 전화번호의 숫자만 취한 후 중간에 하이픈(-)을 넣는다.
function add_hyphen($tel)
{
    $tel = preg_replace("/[^0-9]/", "", $tel);    // 숫자 이외 제거
    if (substr($tel,0,2)=='02')
        return preg_replace("/([0-9]{2})([0-9]{3,4})([0-9]{4})$/", "\\1-\\2-\\3", $tel);
    else if (strlen($tel)=='8' && (substr($tel,0,2)=='15' || substr($tel,0,2)=='16' || substr($tel,0,2)=='18'))
        // 지능망 번호이면
        return preg_replace("/([0-9]{4})([0-9]{4})$/", "\\1-\\2", $tel);
    else
        return preg_replace("/([0-9]{3})([0-9]{3,4})([0-9]{4})$/", "\\1-\\2-\\3", $tel);
}
?>

※ preg_replace 함수는 str_replace 함수보다 처리속도 상당히 늦다. 그러므로 꼭 preg_replace 함수를 써야 하는 경우에 쓰는 것이 좋다.

 

ereg*()함수를 사용하는 것은 보안상 위험하므로 PHP 5.3 이후부터 권장하지 않는다.

 

728x90
블로그 이미지

Link2Me

,