[ php ] PHP 정규식 > php

본문 바로가기
사이트 내 전체검색

php

[ php ] PHP 정규식

페이지 정보

작성자 웹지기 댓글 0건 조회 3,382회 작성일 18-10-01 03:05

본문

파일이나 문자열 내에 포함되어 있는 특별한 패턴(또는 특별한 조건을 만족하는 문자열)을 검색하기 위해 미리 정의된 다양한 특수 문자들의 조합을 정규식(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에서는 정규식과 관련하여 다음의 네가지 함수를 제공한다.

[code]

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

[/code]


[code]

예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

[/code]


[code]

예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

[/code]


[code]

예 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

[/code]


[code]

예 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' 버젼

[/code]


[code]

예 :5

코드 => $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

[/code]


[code]

예 :6

코드 => $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);

[/code]

추천0 비추천0

댓글목록

등록된 댓글이 없습니다.

Total 82건 2 페이지
  • 66 [ php ] json 배열 출력 방식에 따른 차이
  • $data = array('id' =&gt; '88', 'country' =&gt; 'Korea', 'brand' =&gt; 'Samsung, Sony'); 이와같은 값을 json_encode($data); 하면 echo json_encode($data); 다음처럼 출력 {"id":"88","country":"Korea","brand":"Samsung, Sony�...
  • 웹지기 11-06 7810 0 0 댓글 0
  • 65 [ php ] fopen() fwrite() file_put_contents, fgets(), fgetss(…
  • fopen() // http://php.net/manual/kr/function.fopen.php resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] ) fopen ()은 filename으로 지정된 자원을 모드로 읽어 들입니다. filename이 "scheme : // ..."형식 인 경우 URL로 간주되며 PHP는 해당 체계에 대한...
  • 웹지기 10-30 7614 0 0 댓글 0
  • 64 [ php ] 다차원 배열 다중배열에 값 입력하기
  • [code] $aa_ary = array( aaa = array( 'TITLE'=&gt;'제목', 'GETTING STARTED'=&gt;'시작하기' ), bbb = array( 'TITLE'=&gt;'TITLE', 'GETTING STARTED'=&gt;'GETTING STARTED' ) ); print_r2($aa_ary); $aa_ary = array( array(), array(), ......
  • 웹지기 10-24 8160 0 0 댓글 0
  • 63 [ php ] $$aa, $$$aa 와 같은 형태로 푠현되는 가변변수
  • [code] &lt;?php $a = 'hello'; $$a = 'world'; echo ' ::: a ::: '.$a.' ::: $$a ::: '.${$a}; ?&gt; [/code] 이와 같은 형태의 값이 있을 때 [code] &lt;?php echo ' ::: $$a ::: '." $a $hello "; ?&gt; [/code] 와 같이 hello world를 출력 배열을 갖는 가변변수는 $$a[1] 를...
  • 웹지기 10-10 4519 0 0 댓글 0
  • 60 [ php ] 다차원 배열을 원하는 필드로 정렬하고 싶을 때
  • 데이터베이스 테이블을 모방 한 배열이 있다고 가정합니다.각 배열 요소는 행을 나타내며 각 행 내에서 필드 이름과 값을 포함하는 다른 배열입니다.[code]Array( [0] =&gt; Array ( [name] =&gt; 'Sony TV' [price] =&gt; 600.00 ) [1] =&gt; Array ( [name] =&gt; 'LG TV' [price] =&gt; 350.00 ...
  • 웹지기 10-04 3830 0 0 댓글 1
  • 59 [ php ] strstr() 문자열 함수
  • strstr() 함수는 찾고 싶은 문자를 찾은 후 그 이후 값까지 반환한다.대소문자 구분하지 않으려면 stristr() 함수를 사용하면 된다.함수의 원형은 다음과 같다.strstr() 함수 원형[code]string strstr ( string $haystack , mixed $needle [, bool $before_needle ] )[/code]인수- haystack : 입력 문자열- needle : 찾을 문자열- before_needle : 결과가 True이면(기본값은 FALSE) hayst...
  • 웹지기 10-01 5074 0 0 댓글 0
  • 58 [ php ] $_SERVER 옵션 및 사용설명
  • [code]$_SERVER['DOCUMENT_ROOT'] = 현재 사이트가 위치한 서버상의 위치 =&gt; /webapp/include$_SERVER['HTTP_ACCEPT_ENCODING'] = 인코딩 받식 =&gt; gzip, deflate$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 언어 =&gt; ko$_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경 =&gt; Mozilla/4.0(compatible; MSI...
  • 웹지기 10-01 5514 0 0 댓글 0
  • 57 [ php ] foreach 및 array
  • [code]$state_list = array( 1 =&gt; "모집중", 2 =&gt; "마감", 3 =&gt; "운영중");if(!array_key_exists($state, $state_list)) $state = 0;$arr_key = array( "ed_name" =&gt; "평생교육사명", "ed_subject" =&gt; &#...
  • 웹지기 10-01 4661 0 0 댓글 0
  • 열람중 [ php ] PHP 정규식
  • 파일이나 문자열 내에 포함되어 있는 특별한 패턴(또는 특별한 조건을 만족하는 문자열)을 검색하기 위해 미리 정의된 다양한 특수 문자들의 조합을 정규식(regular __EXPRESSION__)이라 한다. 정규식에서의 특수 문자(special character)는 다음과 같다.(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시예 : ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)(2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시예 : aaa$ (문자...
  • 웹지기 10-01 3383 0 0 댓글 0
  • 55 [ php ] 게시판 권한, 그룹관리자 권한 수정시
  • /lib/common.lib.phpfunction is_admin 을 변경// 관리자인가?[code]function is_admin($mb_id){ global $config, $group, $board; if (!$mb_id) return; if ($config['cf_admin'] == $mb_id) return 'super'; //if ($group['gr_admin'] == $mb_id) return 'group'; //그룹관리자를 몽땅 만들기 위해 추가 2011.1.2 FREEMASTER...
  • 웹지기 10-01 6183 0 0 댓글 1
  • 54 [ php ] php로 디렉토리 삭제
  • php 디렉토리와 하위 파일까지 한꺼번에 삭제하는 함수[code]// 사용시 모든 데이터가 날아가므로 주의를 요함(Recursive)function LIB_removeAllData( $URL ){ if( is_dir( $URL )) { if( $dh = opendir( $URL ) ) { while( ( $file = readdir( $dh ) ) !== false ) { if( $file == '.' || $file == ".." ) continue; if( f...
  • 웹지기 09-30 4248 0 0 댓글 0
  • 53 [ php ] php 업로드 작성 및 파일 업로드 보안문제 - 7가지
  • 1.php,inc,html,htm,phtml,php3 등의 확장자는 절대로 올릴 수 없게 한다 !.txt 도 못올리게 합니다. .txt 를 사용해서 쿠키를 훔칠수도 있다.2.업로드 디렉토리는 무조건 htdocs 아래 말고 다른 디렉토리 에 올린다 !!/updir 이나 c:\updir 등 htdocs 와 관련이 없는 디렉토리에 올리게 한다. !!3.CP명령을 사용시에 exec(cp $file , 처럼 exec() 를 절대로 사용하지 말아야 한다.기냥 cp()만을 사용하라 !!!www.php.net/...
  • 웹지기 09-30 4781 0 0 댓글 0
게시물 검색

회원로그인

접속자집계

오늘
2,979
어제
8,121
최대
33,828
전체
8,433,127

그누보드5
Copyright © funyphp.com. All rights reserved.