PHP

정규 표현식 설명

ssNi 2013. 3. 8. 14:15

문자 집합 : [] - 대괄호 사이에 찾고자 하는 문자들의 집합을 표기한다

 [] 안에 존재하는 문자들중 문자만을 나타낸다

예)

[0-9] : 0부터 9까지의 숫자 한 문자

[Aa] : A 혹은 a에 대응하는 한 문자

"-"(하이픈)은 문자 집합인 대괄호 안에서 만 문자의 범위를 지정하는 기호로 쓰인다.

) [abc] a 또는 b 또는 c 중에 한문자를 나타낸다. 여기서 '-' 사용할땐 범위를 나타낸다
[ a-f ] [abcdf] 같은것을 나타낸다
문자클래스 오퍼레이터라는 것에 대해 잠시.. 
유사한 성격의 문자들을 사용자가 알아보기 쉽게 단어로 그룹을 지었다고 보면 된다

alnum :
알파벳과 숫자 
alpha :
알파벳 
blank :
스페이스나 (시스템에 의존적임
cntrl :
아스키코드에서의 127 이상의 문자와 32 이하의 제어문자 
(
한글의 첫째바이트가 127 이상이므로 제어문자로 취급됨 :() 
digit :
숫자 
graph :
스페이스는 제외되고 나머지는 'print' 항목과 같음
lower :
소문자 
print :
아스키코드에서 32에서 126까지의 찍을 있는 문자 
punct :
제어문자도 아니고 알파벳.숫자도 아닌 문자 
space :
스페이스, 케리지 리턴, 뉴라인, 수직 , 폼피드 
upper :
대문자 
xdigit : 16
진수, 0-9, a-f, A-F 

[[:alnum:]]
[a-zA-Z0-9] 같은 의미다
[[:alpha:]]
[a-zA-Z] 같은 의미다
문자열 오퍼레이터는 [] 사이에서만 효력을 발휘한다
그리고 반대의 의미도 가능하다
[^[:alnum:]]
알파벳과 숫자의 조합이 아닌것을 말한다
[^a-zA-Z0-9]
같이 사용될수도 있다

제외 문자 : ^ (캐럿) - ^기호 뒤의 문자를 제외한 문자 (집합기호 - [] - 안에서 쓰일때)

예)

ns[^0-9] : nsx - ns다음의 x가 숫자가 아닌 한 문자에 대응

메타 문자 : 정규표현식에서 특별한 의미를 가지는 문자

정규표현식에서 메타문자 및 기호문자를 찾고자하는 문자에 대응하려면 "\"(escape)를 붙혀 사용한다.

모든 문자 : .(마침표) - 모든 문자에 대응되는 한 문자

공백 문자 : \n, \r, \t, \f-form feed, \v-vertical tab

특별한 문자 형태

숫자와 숫자 아닌문자 : \d - [0-9], \D - [^0-9]

영숫자 문자와 영숫자 문자가 아닌 문자 : \w - [a-zA-Z0-9_], \W - [^a-zA-Z0-9_]

공백문자와 공백이 아닌문자 : \s - [\f\n\r\t\v], \S - [^\f\n\r\t\v]

16진수 8진수 : \x, \0

반복찾기

+ : 한 문자 이상 - + 기호 앞으 문자가 하나 이상 반복

* : 문자가 없거나 하나 이상 반복

? : 문자가 없거나 하나와 대응하는 문자 예) https?// - s가 없거나 한번 있는 경우와 대응

반복회수 지정하기 : {} (중괄호) - 중괄호 앞의 문자에 대하여 반복회수 지정,  앞에 있는 문자나 문자열의 개수를 정하는

반복회수 지정 : {반복회수} - 저정된 회수만큼 반복하는 경우 대응, ()안에 있는 글자들을 그룹화

예)

#[0-9A-Fa-f]{6} - 16진수 RGB표기

최소, 최대 반복회수 지정 : {최소, 최대} - 최소번 또는 최대번만 반복되는 경우 대응, 최소값에 0과 최대값의 생략 가능

) "ab" "abb" 나타낸다. b 개수가 2개를 나타낸다
"ab{2,}"
abb, abbbbb b 개수가 2 이상을 나타낸다
"ab{3,5}"
abbb, abbbb, abbbbb 같이 b 3개에서 5 까지를 나타낸다

예)

\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4} - -또는 / 구분의 날짜 표기

greedy와 lazy 수량자

탐욕적 수량자 : +, *, {n,}

게으른 수량자 : +?, *?, {n,}?

예) abcd <b>xxx</b> and <b>yyy</b> efgh

greedy : <[Bb]>.*</[Bb]> --> <b>xxx</b> and <b>yyy</b>

lazy : <[Bb]>.*?</[Bb]> --> <b>xxx</b> 와 <b>yyy</b>

단어 경계 지정

단어 사이의 공백 : \b - 공백문자(space)와 일치하지만 공백을 일치하는 문자로 지정하지는 않는다. (\B - \b와 반대) --> 단어 사이의 구분자로 쓰임

실제 공백 문자를 찾을 때는 [ ]또는 \s를 활용한다.

시작 문자 지정 : ^(캐럿) - 제외 문자와 달리 표현식의 처음에 사용되어 다음에 나오는 문자를 시작하는 문자로 지정할 수 있다.

마지막 문자 지정 : $ - 앞에 나온 문자가 마지막에 일치할때

다중행 모드 : (?m)

지정한 문자열을 줄단위로 분리하여 표현식을 검색한다.

표현식의 가장 앞에 써준다.

다중행 모드 지정시 ^와 $를 지정단 문자열의 줄단위로 검색하는 것이 가능하다.

예) 라인단위 주석(//) 문자로 부터 해당 라인의 끝까지

(?m)^//.*$

하위 표현식 : () - 괄호

표현식 일부를 괄호로 묶어준다.

중첩 하위 표현식 : 괄호안에 괄호...

or 연산자 : | - | 기호의 좌우 둘중 하나가 일치하는 경우

"a|b" a 또는 b 둘중 하나를 나타낸다

참고할것은 기호인데 이것은 . (, ) 단지 다음에 오는것이 문자라는것을 
의미한다. 어떤한 처리도 없이 문자로만 인식한다
{1,3}
하고 하면 {1,3} 와는 다르다

예) 아이피 형식의 문자열

(\d{1,3}\.){3}\d{1,3}

(((\d{1,2})|(1\d{2}))|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2}))|(2[0-4]\d)|(25[0-5]))

역참조 : \1 ~ \9

표현식 중 하위 표현식의 순서와 지정한 번호가 해당 하위 표현식과 일치한다.

0번을 지정하면 해당 표현식 전부와 일치한다.

예) html의 <H1~6>태그의 내용 찾기

<Hh([1-6])>.*?</Hh\1>

전방탐색과 후방탐색 : 하위표현식으로 표현

전방탐색 : ?= - 지정한 전방 탐색 기호의 다음 표현식으로 부터 앞에 나오는 일치하는 문자를 찾는다.

후방탐색 : ?<= - 지저한 후방 탐색 기호의 다음 표현식으로 부터 뒤에 나오는 일치하는 문자를 찾는다.

예) html tag기회 내의 내용

(?<=<[Tt][Ii][Tt][Ll][Ee]>).*?(?=</[Tt][Ii][Tt][Ll][Ee]>)

부정형 전/후방 탐색 : 전방 - ?!, 후방 - ?<!

예) $로 시작하지 않는 숫자

\b(?!\$)\d+\b

조건 달기 : ?

? 앞의 문자(표현식)가 없거나 한번 일치할때 해당하는 앞으 문자(표현식)과 일치한다.

전후방 탐색(?=, ?<=)의 뒤에 나오는 표현식과 일치할때...

역참조 조건 : (?(backreference)true), (?(backreference)true|false)

backreference는 역참조 대상의 하위 표현식이며, \를 붙이지 않고 해당 하위 표현식 순서에 해당하는 번호를 지정한다.

예) IMG 태그나 이미지 태그를 싸고 있는 A태그

(<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*</[Aa])>)

예)

(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}

전방 탐색 조건 : (?(?=condition)expressions)

예)

\d{5}(?(?=-)-\d{4})

1. ^ $ 사용의  

'^'
바로 문자뒤의 문자열로 시작 됨을 가르킨다
"^The" :
"The" 시작 하는 문자를 말한다

'$'
문자열의 마지막을 가르킨다
"of despair$" :
"of despair" 끝나는 문자열이다

"^abc$" :
hello 시작해 hello 끝나는 경우 이므로 "abc" 해당된다.. 


2. '.' '*' '+' '?'
사용법 

'.'
어떤 문자든지 임의의 한문자를 말한다. 하나의 문자가 있어야 한다
) "x.z" xyz, xxz, xbz 등이고 xz xyyz 안된다

'*'
바로 앞의 문자가 없거나 하나 이상의 경우를 말한다
) "ab*" a, abc, ab, abbbb 등을 말한다

'+'
바로 앞의 문자를 나타내면 1 이상이어야 한다
) "ab+" abc, abbb 등이고 a 되지 않는다

'?'
바로 앞의 한문자가 있거나 없는것을 말한다. 단지 한문자 만이어야 한다
) "ab?" a 또는 ab 나타낸다

3. '()' ()안에 있는 글자들을 그룹화 한다

) a(bc)* a, abc abcbc 'bc' 없거나 하나 이상인 경우이다
"a(bc)"
abcbc 나타낸다

4. 기초 활용 

"a(bc)*"
a라는 문자를 포함하고 bc라는 문자열이 없거나 계속반복되는 문자열이다
이것은 a, abc ,abcbc abcbcbc.... 등의 문자열을 의미한다

"a(bc){1,5}"
a 라는 문자를 포함하고 bc 라는 문자를 묶은 형태인데. bc 라는 문자가 
한번에서 5번까지를 말한다. --말이 어렵다.... 
이것은 abc,abcbc,abcbc,abcbcbc,abcbcbcbc,abcbcbcbcbc 문자열을 의미한다

^[1-9][0-9]*$
자연수를 표시할수 있다
^(0|[1-9][0-9]*)$
0 포함하는 자연수 
^(0|-?[1-9][0-9]*)$
정수표시 
^[0-9]+(.[0-9]+)?$
소숫점 표시 
^[0-9]+(.[0-9])?$
소수점 둘째자리 까지 
^[0-9]+(.[0-9]{1,2})?$
소수점 둘째자리나 첫째자리 
^[0-9]{1,3}(,[0-9])*(.[0-9]{1,2})?$
돈의 표시... 
(
센트까지 표시가능 2,200.20 : 이천이백이십센트 또는 이천이백이십전 맞나?) 

5.
복합활용 

5-1
메일 주소 체킹.. 

5-1-1 :
유저명@도메인명 

유저명 : 대문자, 소문자, 숫자 그리고 '.' '-' '_' 가질 수있지만 . 시작해서는 안된다
[_0-9a-zA-Z-]+(.[_0-9a-zA-Z]+)* 
이때에는 eregi 사용할때까 아닌 ereg 사용할때이다. eregi 함수는 대소문자구분이 없다
^[_a-z0-9-]+(.[_a-z0-9-]+)*$ eregi
함수를 사용할때... 

5-1-2 :
도메인 : 유저명과 기본적으로는 같지만 _ 없다
^[a-z0-9-]+(.[a-z0-9-]+)*$ 

5-1-3 :
메일 주소 체킹 
위의 것의 조합이다

^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$ 

5-2 URL
 http:// 붙여주기 

URL
대문자, 소문자, 숫자 ,'.','_','=','&','?','~','@','/','+' 사용 할수 있다 
 http://([0-9a-zA-Z./@~?&=_]+)  된다


$add="www.codelib.co.kr"; 
$pattern ="([0-9a-zA-Z./@~?&=_]+)"; 
$link =ereg_replace($pattern, "http://1" $add); 
echo ("$link"); 

결과 $link 다음처럼 변경 된다
http://www.codelib.co.kr 
같이 된다. 참고로 1 첫번째 괄호안의 값을 말한다. 2 2번째
.. 

 

필수 정규 표현식

이름입력 - 한글 2~5자리 허용

"/^[\x{ac00}-\x{d7af}]{2,5}$/u"

 

이메일 - 워낙많은 정규식들이 있어서 가장 유용하다 싶은 정규식으로 만들어봤습니다.

"/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"

 

집전화번호 - 지역번호가 들어간 전화번호를 확인할때 유용합니다.

"/^(070|02|031|032|033|041|042|043|051|052|053|054|055|061|062|063|064)-\d{3,4}-\d{4}$/u"

 

휴대폰번호 - 문자 발송등의 작업할경우 휴대폰 번호만 입력받을경우 유용합니다.

"/^(010|011|016|017|018|019)-\d{3,4}-\d{4}$/u"

 

우편번호 - 6자리 숫자로 가운데 -(하이픈) 있는경우와 없는경우 둘다 허용합니다.

"/^\d{3}-?\d{3}$/u"

 

아이디 - 아이디는 영문/숫자만 허용하며, 첫글자는 영문자로 시작하여야 하며, 3자리에서 8자리 이내로 입력받음

"/^[a-zA-Z]\w{2,7}$/u"

 

주민번호 - 숫자 13자리를 받으며, 가운데 -(하이픈) 있어도 없어도 되며, 일부 자리수에 대하여 나올수 있는 숫자에 제한을 두었음

"/^\d{2}[0-1]\d[0-3]\d-?[1-6]\d{6}$/u"

 

날짜 - 일반 -(하이픈)형태의 날짜를 받으며, 자리수 별로 올수 없는 숫자의 경우 일부 제한을 두어 너무 엉뚱한 날짜 입력을 일부 막음

"/^[1-2][9|0]\d{2}-[0-1]\d-[0-3]\d/u"

 

예시 참고

http://www.ncube.net/2622

 

정규식 + snoopy 클래스 사용 사이트 긁어오기

http://hosting.websearch.kr/128

 

snoopy 로그인 처리

http://moonseller.net/345

 

정규표현식 문자

: http://plusdream.tistory.com/196

 

메일 정규식 표현

http://hanvic.egloos.com/3256875

 

참고 사이트 :

http://taegwan.blogspot.kr/2010/08/php-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EC%A0%95%EB%A6%AC.html

'PHP' 카테고리의 다른 글

Source Tree  (0) 2013.03.11
생활코딩 - Xdebug  (0) 2013.03.11
curl 원격지 xml 가져오기  (0) 2013.03.11
PHP 정규 표현식(정규식:Regular expression)  (0) 2013.03.08
PHP라이브러리 – Snoopy  (0) 2013.03.08