정규표현식을 제대로 사용할 수 있다면 대부분의 환경에서 어떤 데이터라도 떡 주무르듯이 다룰 수 있다.
(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회 이상 나오는 경우를 " " 로 변경
정규식을 만들 경우 원하는 결과가 나오는지 테스트해보고 싶다면
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 이후부터 권장하지 않는다.
'정규표현식' 카테고리의 다른 글
폰번호, 아이디, 이메일, 성명 등 마스킹처리 (PHP 정규표현식) (0) | 2021.07.28 |
---|---|
55에서 255까지의 범위 정규식 (PHP 정규표현식) (0) | 2021.07.28 |
전화번호 추출 PHP 정규표현식 예제 (0) | 2021.07.27 |
PHP 정규표현식 특정범위 숫자 찾기 (0) | 2018.06.28 |
정규표현식 개념 및 PHP 정규표현식 연습 ★★★ (0) | 2018.06.26 |