리눅스, 자료실, 성경검색, 추억의게임, 고전게임, 오락실게임, rootman, http://www.rootman.co.kr
* 35.172.201.102 *
| Home | Profile | Linux | 자료실 | zabbix | Mysql 5.6 | 갤러리 | 성경검색 | 해피니스 | 자유게시판 | 게시물검색 | L | O | R |    

 
[php] [php] 정규식표현(Regular Expression Functions)
 작성자 : rootman
Date : 2005-05-03 15:03  |  Hit : 11,831  
파일이나 문자열 내에 포함되어 있는 특별한 패턴
(또는 특별한 조건을 만족하는 문자열)을 검색하기 위해 미리 정의된 다양한 특수 문자들의 조합을 정규식(regular expression)이라 한다.
정규식에서의 특수 문자(special character)는 다음과 같다.


----------------------------------------------------------------------------------
1. 정규식
----------------------------------------------------------------------------------
(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시
활용) /etc/services 파일에서 rsync로 시작되는 문자열



(2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시
활용) /etc/mail/sendmail.cf 파일에서 "#define으로 시작하면서 dnl로 끝나는 문자열을 표시



(3) . (period) : 임의의 한 문자를 표시
예)
^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)


(4) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄
[]내에서 "^"이 선행되면 not을 나타냄
이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다.
여기에서 "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower, print, space, uppper, xdigit가 있다.

이에 대한 자세한 내용은 C언어의 를 참조하면 된다.

예를 들어 [:digit:]는 [0-9]와 [:alpha:]는 [A-Za-z]와 동일하다.

이외에 [:<:]와 [:>:]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝을 나타낸다.

ex) [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일)

[Yy] (Y 또는 y)
[A-Za-z0-9] (모든 알파벳과 숫자)
[-A-Z]. ("-"(hyphen)과 모든 대문자)
[^a-z] (소문자 이외의 문자)
[^0-9] (숫자 이외의 문자)
[[:digit:]] ([0-9]와 동일)


(5) {} (brace) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄
ex)
a{3} ('a'의 3번 반복인 aaa만 해당됨)
a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄)
a{3,5} (aaa, aaaa, aaaaa 만 해당됨)
ab{2,3} (abb와 abbb 만 해당됨)
[0-9]{2} (두 자리 숫자)
doc[7-9]{2} (doc77, doc87, doc97 등이 해당)
[^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당)
.{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)


(6) * (asterisk) : "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열
ex)
ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등)
* (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨)
.* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨)
ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등)
a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등)
doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당)
[A-Z].* (대문자로만 이루어진 문자열)
like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이 됨, like, likely, liker, likelihood 등)


(7) + (asterisk) : "+" 직전의 선행문자가 1번 이상 나타나는 문자열
예)
ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨)
ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등)
like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨)
[A-Z]+ (대문자로만 이루어진 문자열)

예) http://www.rootman.co.kr 같은 URL 표시
^[[:alnum:]]+/*$


(8) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
ex)
ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)


(9) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용


(10) | (bar) : or를 나타냄
예) nationlist.txt 파일에서 korea 또는 china 문자열만 검색



(11) \\ (backslash) : 위에서 사용된 특수 문자들을 정규식내에서 문자를 취급하고 싶을 때 '\\'를 선행시켜서 사용하면됨
예) iplist.txt 파일에서 1.2.3 문자열을 검색 (특수 문자를 문자로 취급)

[\\?\\[\\\\\\]] ('?', '[', '\\', ']' 중 하나)


정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함
정규식은 Unix의 대표적인 유틸리티인 vi, emacs, ed, sed, awk, grep, egrep 등에서 사용할 수 있다.
다음은 grep에서 정규식을 활용한 예를 보여 주고 있다.


----------------------------------------------------------------------------------
2. egrep 정규식을 활용한 예
----------------------------------------------------------------------------------
(1) /root 디렉터리에서 "directory" 구조만 찾아냄



(2) /root 디렉터리에서 "directory" 구조가 아닌 것들만 검색



(3) sitelist.txt 파일에서 사이트 URL만 추려냄..



(4) sitelist.txt 파일에서 사이트 URL 중 index.html로 끝나는 파일만 검색




----------------------------------------------------------------------------------
3. PHP에서는 정규식과 관련하여 다음의 네가지 함수를 제공
----------------------------------------------------------------------------------
(1) int ereg(string givenPattern, string givenString, array matched);
- givenString을 "string1stringAstring2stringBstring3 ... string9stringI" 로 주어져 있다고 하자.
이때 stringA, stringB, ... , stringI는 NULL 이어도 상관이 없다
(즉 givenString은 "string1string2string3 ... string9" 인 경우임).

- givenString이 위와 같이 주어진 경우,
givenPattern은 "(pattern1)stringA(pattern2)stringB(pattern3) ... (pattern9)stringI"로 입력하여야 한다.
즉 pattern1, pattern2, ..., pattern9는 각각 string1, string2, ... , string9에서 찾고자하는 정규식인 것이다.

- 이때 pattern1이 string1에서 발견한 패턴은 $matched[1]에 저장되고,
pattern2가 string2에서 발견한 패턴은 $matched[2]에 저장되고,
..., pattern9가 string9에서 발견한 패턴은 $matched[9]에 저장된다.

PHP3의 경우 ereg에서는 최대 9개 까지의 pattern을 찾을 수 있도록 설정되어 있음에 유의하자.

- 그리고 $matched[0]에는 $matched[1]stringA$matched[2]stringB ... $matched[9]stringI가 저장된다.
- ereg가 반환하는 값은 $matched[0]에 저장된 문자열의 개수이다.
- ereg는 case sensitive
- eregi는 case insensitive


1) 예1
코드 => print(ereg ("(.*)ef([abc].*)","abcdefabc",$matched));
print("
");
while (list($a,$b)=each($matched))
if ($b) print("$a, $b
");

결과 => 9
0, abcdefabc
1, abcd
2, abc

2) 예2
코드 => print(ereg ("(.*)d(.*)e(.*)qrs(.*)","abcdefghijklmnopqrstuvwxyz",$matched));
print("
");
while (list($a,$b)=each($matched))
if ($b) print("$a, $b
");

결과 => 26
0, abcdefghijklmnopqrstuvwxyz
1, abc
3, fghijklmnop
4, tuvwxyz

3) 예 3
코드 => $date="1999-11-17";
if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs))
print("$regs[3].$regs[2].$regs[1]");
else print("Invalid date format: $date");

결과 => 17.11.1999

4) 예 4
코드 => $joomin="711011-1234567";
if (ereg("([0-9]{2})([01]{1}[09]{1}[0-3]{1}[0-9]{1})-([12]{1}[0-9]{6})",$date, $regs))
print("Valid");
else print("Invalid format: $joomin");


(2) int eregi(string givenPattern, string givenString, array matched);
- ereg의 'case insensitive' 버젼

1) 코드 => $email="[email protected]";
eregi("(^[_\\.0-9a-z-]+)@(([0-9a-z][0-9a-z-]+\\.)+)([a-z]{2,3}$)",$email,$matched);

while (list($a,$b)=each($matched))
if ($b) print("$a, $b
");

결과 => 0, [email protected]
1, xs9_tx-abc.yyy_c
2, cne.kyungsung.ac.
3, ac.
4, kr


2) 코드 => eregi("^[_\\.0-9a-z-][email protected]([0-9a-z][0-9a-z-]+\\.)+[a-z]{2,3}$",$email,$matched);

while (list($a,$b)=each($matched))
if ($b) print("$a, $b
");

결과 => 0, [email protected]
1, ac.


(3) string ereg_replace(string givenPattern, string replacementPattern, string givenString);
- givenString에서 givenPattern에 부합하는 텍스트(matched text)를 찾아서, replacementPattern으로 대체
- givenPattern이 "(패턴)"으로 묶인 문자열들을 포함하고 있으면, replacementPattern에는 이에 대응하는 "\\\\digit(문자열)" 형태의 문자열들을 포함하고 있어야 한다(digit는 0, 1, ... ,9 중 하나). 그리고 givenString은 "(패턴)"을 이용해 찾은 결과들을 "\\\\digit(문자열)"에 있는 "문자열"들로 대체하게 된다. "\\\\0" 는 givenString 전체에 대해 "(패턴)"의 결과를 적용할 때 이용된다.
- 변경된 문자열을 리턴
- case sensitive


1) 코드 => $string = "This is a test";
print(ereg_replace(" is", " was",$string)); print("
");
print(ereg_replace("( )is","\\\\1was",$string)); print("
");
print(ereg_replace("(( )is)","\\\\2was",$string)); print("
");
print(ereg_replace("(( )is)(( )a)(( )test)", "\\\\1was\\\\2an\\\\3exam",$string));

결과 => "This was a test";
"This was a test";
"This was a test";
"This was an exam";


2) 예 2 : redundant whitespace 없애기
코드 => $str ="~ s/\\s+/ /g";
$str = eregi_replace("[[:space:]]+", " ", $str);
print("$str
");

결과 => ~ s/\\s+/ /g


3) string eregi_replace(string givenPattern, string replacementPattern, string givenString);
- ereg_replace의 'case insensitive' 버젼

 
 

Total. 645
번호 분류 제목 작성자 등록일 조회수
645 기초강좌 NFS server unable to open connection to tcp6/udp6 networks rootman 09-27 2409
644 php [php] mssql ms-sql 한글 변환 끄적임.. 정리 rootman 03-29 3485
643 기초강좌 java vim 에서 자바 환경 만들기 rootman 02-16 2598
642 삭제예정 [xencenter] xenserver tool 설치 rootman 08-24 3664
641 mysql [mysql] Creating a File-Per-Table Tablespace Outside the Dat… rootman 08-03 3856
640 기초강좌 Centos Xwindow 설치 rootman 06-16 4736
639 php [php] highlight 함수 rootman 04-01 4591
638 qmail [qmail] qmail-scanner에 filtering 된 이메일 처리 rootman 02-14 5004
637 Shell [날짜] awk를 이용하여 unixtime의 시간 차 구하기 rootman 01-27 5984
636 기초강좌 centos에 그놈(gnome) 설치하기 rootman 01-10 5932
635 쉘(awk) [awk] shell 변수 사용하기 rootman 12-27 5534
634 기초강좌 서버 캐시 메모리 초기화하기 (drop_caches) rootman 12-11 6604
633 windows tips 그리드 제거 배치 스크립트 rootman 11-28 6171
632 기초강좌 패스워드 lockgin control rootman 09-06 4
631 windows tips win7 자동 로그인 설정하기 rootman 08-18 6262
 1  2  3  4  5  6  7  8  9  10    
AND OR