영문 php 메뉴얼 도움말:
http://www.php.net/distributions/manual/php_manual_en.chm
목차->테이블 오브 컨텐츠->Regular Expression Functions (Perl-Compatible)(정규식..ㅋ)
파일이나 문자열 내에 포함되어 있는 특별한 패턴(또는 특별한 조건을 만족하는 문자열)을 검색하기 위해 미리 정의된 다양한 특수 문자들의 조합을 정규식(regular expression)이라 한다. 정규식에서의 특수 문자(special character)는 다음과 같다.
(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시
예 : ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시
예 : aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(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언어의 <ctype.h>를 참조하면 된다.
예를 들어 [:digit:]는 [0-9]와 [:alpha:]는 [A-Za-z]와 동일하다.
이외에 [:<:]와 [:>:]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝
을 나타낸다.
예 : [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) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄
예 : 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번 또는 여러번 나타나는 문자열
예 : 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]+ (대문자로만 이루어진 문자열)
(8) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
예 : ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)
(9) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용
(10) | (bar) : or를 나타냄
예 : a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
korea|japan|chinese (korea, japan, chinese 중 하나)
(11) \ (backslash) : 위에서 사용된 특수 문자들을 정규식내에서 문자를 취급하고 싶을 때 '\'를 선행시켜서 사용하면됨
예 : filename\.ext ("filename.ext"를 나타냄)
[\?\[\\\]] ('?', '[', '\', ']' 중 하나)
정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함
정규식은 Unix의 대표적인 유틸리티인 vi, emacs, ed, sed, awk, grep, egrep 등에서 사용할 수 있다. 다음은 grep에서 정규식을 활용한 예를 보여 주고 있다.
(1) $ 명령어 | grep '정규식'
<= 명령어의 결과를 grep이 입력받아 정규식을 이용하여 패턴을 찾아냄
예 : $ who | grep 'hgkim' <= hgkim이라는 사용자가 login 해 있는지를 알아봄
$ ls -al | grep '^d.*' <= ls -al 의 결과 'd'로 시작하는 라인(즉 디렉토리들)
만을 출력
$ ls -al | grep '^d.*' <= ls -al 의 결과 'd'로 시작하는 라인(즉 디렉토리들)
만을 출력
$ ls -al | grep '^[^d]..x..x..x' <= 디렉토리는 제외하고("[^d]") 누구나
실행가능한 파일("..x..x..x")들 찾기
(2) $ grep '정규식' 파일이름
<= 파일을 입력받아 정규식을 이용하여 패턴을 찻아냄
예: $ grep 'telnet' /etc/inetd.conf
이외의 명령어들도 grep과 유사한 형태로 이용된다. 따라서 정규식을 잘 이용하면 유닉스의 활용이 배가 될 것이다.
PHP에서는 정규식과 관련하여 다음의 네가지 함수를 제공한다.
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 :
코드 => print(ereg ("(.*)ef([abc].*)","abcdefabc",$matched));
print("<br>");
while (list($a,$b)=each($matched))
if ($b)
print("$a, $b <br>");
결과 => 9
0, abcdefabc
1, abcd
2, abc
예2 :
코드 => print(ereg ("(.*)d(.*)e(.*)qrs(.*)","abcdefghijklmnopqrstuvwxyz",$matched));
print("<br>");
while (list($a,$b)=each($matched))
if ($b)
print("$a, $b <br>");
결과 => 26
0, abcdefghijklmnopqrstuvwxyz
1, abc
3, fghijklmnop
4, tuvwxyz
예 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 :
코드 => $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");
int eregi(string givenPattern, string givenString, array matched);
- ereg의 'case insensitive' 버젼
예 :
코드 => $email="xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr";
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 <br>");
결과 => 0, xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr
1, xs9_tx-abc.yyy_c
2, cne.kyungsung.ac.
3, ac.
4, kr
코드 => 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 <br>");
결과 => 0, xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr
1, ac.
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
예 :
코드 => $string = "This is a test";
print(ereg_replace(" is", " was",$string)); print("<br>");
print(ereg_replace("( )is","\\1was",$string)); print("<br>");
print(ereg_replace("(( )is)","\\2was",$string)); print("<br>");
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 : redundant whitespace 없애기
코드 => $str ="~ s/\s+/ /g";
$str = eregi_replace("[[:space:]]+", " ", $str);
print("$str<br>");
결과 => ~ s/\s+/ /g
string eregi_replace(string givenPattern, string replacementPattern, string givenString);
- ereg_replace의 'case insensitive' 버젼
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 7530 | 10년 전 | 744 | ||
| 7529 |
파랑새1597
|
10년 전 | 1183 | |
| 7528 |
파랑새1597
|
10년 전 | 1277 | |
| 7527 |
integrity7
|
10년 전 | 1358 | |
| 7526 | 10년 전 | 2391 | ||
| 7525 |
다빈치코드777
|
10년 전 | 1082 | |
| 7524 | 10년 전 | 1550 | ||
| 7523 | 10년 전 | 951 | ||
| 7522 |
|
10년 전 | 971 | |
| 7521 |
blackkil
|
10년 전 | 1842 | |
| 7520 | 10년 전 | 1261 | ||
| 7519 |
Gaumi
|
10년 전 | 1059 | |
| 7518 | 10년 전 | 1468 | ||
| 7517 | 10년 전 | 805 | ||
| 7516 | 10년 전 | 1264 | ||
| 7515 | 10년 전 | 1387 | ||
| 7514 |
|
10년 전 | 4474 | |
| 7513 |
멋진남자임
|
10년 전 | 1126 | |
| 7512 |
다빈치코드777
|
10년 전 | 855 | |
| 7511 |
|
10년 전 | 3379 | |
| 7510 | 10년 전 | 1346 | ||
| 7509 | 10년 전 | 1113 | ||
| 7508 | 10년 전 | 700 | ||
| 7507 |
senseme
|
10년 전 | 717 | |
| 7506 |
멋진남자임
|
10년 전 | 1615 | |
| 7505 | 10년 전 | 3974 | ||
| 7504 | 10년 전 | 2130 | ||
| 7503 | 10년 전 | 975 | ||
| 7502 | 10년 전 | 507 | ||
| 7501 | 10년 전 | 1428 | ||
| 7500 | 10년 전 | 1471 | ||
| 7499 | 10년 전 | 3356 | ||
| 7498 | 10년 전 | 1166 | ||
| 7497 |
dethos79
|
10년 전 | 2948 | |
| 7496 | 10년 전 | 2105 | ||
| 7495 | 10년 전 | 813 | ||
| 7494 |
CHAVO
|
10년 전 | 1099 | |
| 7493 | 10년 전 | 2621 | ||
| 7492 | 10년 전 | 1206 | ||
| 7491 | 10년 전 | 1431 | ||
| 7490 | 10년 전 | 2311 | ||
| 7489 | 10년 전 | 2102 | ||
| 7488 |
toptopon
|
10년 전 | 871 | |
| 7487 |
|
10년 전 | 1014 | |
| 7486 | 10년 전 | 3336 | ||
| 7485 | 10년 전 | 1293 | ||
| 7484 | 10년 전 | 1354 | ||
| 7483 | 10년 전 | 1008 | ||
| 7482 | 10년 전 | 634 | ||
| 7481 | 10년 전 | 850 | ||
| 7480 | 10년 전 | 1209 | ||
| 7479 | 10년 전 | 2578 | ||
| 7478 | 10년 전 | 1130 | ||
| 7477 |
멋진남자임
|
10년 전 | 1478 | |
| 7476 |
zeppeto
|
10년 전 | 1132 | |
| 7475 |
200점아빠
|
10년 전 | 905 | |
| 7474 | 10년 전 | 3994 | ||
| 7473 | 10년 전 | 969 | ||
| 7472 |
나르시스1
|
10년 전 | 1209 | |
| 7471 | 10년 전 | 866 | ||
| 7470 | 10년 전 | 1255 | ||
| 7469 |
플라이SINJI
|
10년 전 | 931 | |
| 7468 |
|
10년 전 | 516 | |
| 7467 |
|
10년 전 | 627 | |
| 7466 | 10년 전 | 1091 | ||
| 7465 | 10년 전 | 1164 | ||
| 7464 |
|
10년 전 | 1172 | |
| 7463 | 10년 전 | 1220 | ||
| 7462 |
진짜별사탕
|
10년 전 | 836 | |
| 7461 | 10년 전 | 922 | ||
| 7460 | 10년 전 | 3702 | ||
| 7459 |
멋진남자임
|
10년 전 | 1536 | |
| 7458 |
멋진남자임
|
10년 전 | 473 | |
| 7457 | 10년 전 | 905 | ||
| 7456 | 10년 전 | 747 | ||
| 7455 | 10년 전 | 2128 | ||
| 7454 | 10년 전 | 617 | ||
| 7453 | 10년 전 | 798 | ||
| 7452 |
중국어사이트제작
|
10년 전 | 498 | |
| 7451 | 10년 전 | 889 | ||
| 7450 | 10년 전 | 616 | ||
| 7449 |
울라라라우
|
10년 전 | 922 | |
| 7448 | 10년 전 | 1624 | ||
| 7447 |
멋진남자임
|
10년 전 | 480 | |
| 7446 | 10년 전 | 524 | ||
| 7445 |
네이비칼라
|
10년 전 | 1645 | |
| 7444 |
senseme
|
10년 전 | 1385 | |
| 7443 | 10년 전 | 1321 | ||
| 7442 | 10년 전 | 701 | ||
| 7441 |
멋진남자임
|
10년 전 | 1417 | |
| 7440 | 10년 전 | 876 | ||
| 7439 |
|
10년 전 | 735 | |
| 7438 |
|
10년 전 | 911 | |
| 7437 |
basement
|
10년 전 | 1019 | |
| 7436 |
잘살아보자
|
10년 전 | 1105 | |
| 7435 | 10년 전 | 1051 | ||
| 7434 | 10년 전 | 3778 | ||
| 7433 |
|
10년 전 | 2715 | |
| 7432 |
alexkim
|
10년 전 | 839 | |
| 7431 |
이웃집초보
|
10년 전 | 1291 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기