PHP 예제를 통한 정규표현식 사용법 배우기

01 14, 2007 03:15
여러분은 문서편집기에서 특정문자를 찾는 기능을 써 본적이 있을것입니다. 정규표현식은 이런한 특정문자가 아닌 일정한 패턴을 가지고 있는 문자열을 찾을 때 유용하게 쓰일 수 있습니다. 또, email처럼 규칙에 맞게 사용해야 되는것의 타당성을 검사 할 때도 사용할 수 있습니다. 이번 강좌에서는 정규표현식의 기본적인 문법을 간단한 예제를 통해 배워보도록 하겠습니다.

* 참고사이트 :
   http://www.phpbuilder.com/columns/dario19990616.php3

  • 정규표현식의 기본문법

    제일 먼저 '^''$'의 두 가지 기호에 대해 알아보겠습니다. '^'와 '$'은 시작과 끝을 나타내는 문자입니다. 아래 예제를 보세요.

    "^The" : "The"로 시작하는 문자열을 체크합니다.
    "of despair$" : "of despair"로 끝나는 문자열을 체크합니다.
    "^abc$" : "abc"로 시작하고 끝나는 문자열
                  -- 즉, 문자열 자체가 "abc"인 경우만 가르킵니다.
    ""notice"" : "notice"를 포함하는 문자열을 말합니다


    하나의 문자나 여러개의 문자열의 수를 나타내는 '*', '+', '?'기호도 있습니다. 이 기호들의 의미는 "없거나 여러개", "하나 또는 여러개", "없거나 하나"입니다. 아래에 예제를 보세요.

    "ab*": "a"뒤에 "b"가 없거나 여러개 이어서 오는 문자열을 가르킵니다.
            ("a", "ab", "abbb", etc.)
    "ab+": "a"뒤에 "b"가 하나 이상 이어서 오는 문자열을 가르킵니다.
            ("ab", "abbb", etc.)
    "ab?": "a"뒤에 "b"가 없거나 하나인 문자열을 가르킵니다.
    "a?b+$": "a"가 없거나 하나이고 "b"가 하나 이상인 문자열로 끝나는 문자열을
                가르킵니다.


    "{ }"와 범위를 정해서 경계(bound)를 사용할 수 도 있습니다. 다음 예제를 보세요.

    "ab{2}": "a"뒤에 "b"가 2번따라 오는 문자열을 가르킵니다. ("abb")
    "ab{2,}": "a"뒤에 "b"가 적어도 2번 이상 따라오는 문자열을 가르킵니다.
                ("abb", "abbbb", etc.)
    "ab{3,5}": "a"뒤에 "b"가 3~5번 따라오는 문자열을 가르킵니다.
                ("abbb", "abbbb", or "abbbbb")


    주의 할 것은 {0,2}와 같이 범위가 시작되는 부분을 명시해야 합니다. { ,2}와 같이 사용해서는 안됩니다. "*"은 "{0,}", "+"는 "{1,}", "?"는 "{0,1}"과 같은 효과를 가집니다.

    문자열에 "()"를 사용해서 다음과 같이 사용할 수 도 있습니다.

    "a(bc)*": "a"뒤에 "bc"가 없거나 한번이상 오는 문자열을 체크합니다.
    "a(bc){1,5}": "a"뒤에 "bc"가 1~5번오는 문자열을 체크합니다.


    "|"기호는 OR연사자와 같은 역할을 합니다. 아래 예제를 보세요.

    "hi|hello": "hi" 또는 "hello" 문자열을 체크합니다.
    "(b|cd)ef": "bef" 또는 "cdef" 문자열을 체크합니다.
    "(a|b)*c": "a" 또는 "b"가 없거나 한번 이상오고 뒤에 "c"가 오는 문자열을 체크합니다.


    "."는 임의의 한 문자를 나타냅니다. 아래 예제를 보세요.

    "a.[0-9]": "a"뒤에 임의의 한 문자가 오고 그 뒤에 0~9중에서 하나의 수가 오는
                   문자열을 체크합니다.
    "^.{3}$": 임의의 문자 3개로 시작해서 끝나는 문자열을 체크합니다.


    "[]"는 "[]"안에 포함된 하나의 문자를 체크합니다.

    "[ab]": "a|b"와 같은 효과를 내는 표현으로 "a" 또는 "b" 문자중 하나를
               체크합니다.
    "[a-d]": "a|b|c|d", "[abcd]" 와 같은 효과를 내는 표현으로 a~d범위내에서
                 하나의 문자를 체크합니다.
    "^[a-zA-Z]": 영문 소문자나 대문자로 시작하는 것을 체크합니다.
    "[0-9]%": 0~9중의 하나가 오고 뒤에 %가 오는 문자열을 체크합니다.
    ",[a-zA-Z0-9]$": ","뒤에 영문 소문자나 대문자나 0~9중 하나의 문자가 오는
                            문자열로 끝나는 것을 체크합니다.


    사용하기 원하지 않는 문자열을 제외시키려면 "[]"안에서 "^"를 사용하면 됩니다.

    "%[^a-zA-Z]%" : "%"사이에 영문 소문자와 대문자를 제외한 임의의 문자가
                             오는 것을 체크합니다.


    특별한 의미를 가지고 있는 "^.[$()|*+?{\"와 같은 탈출문자들을 있는 그대로 표현하려면 탈출시키는 기능을 하는 "\"를 앞에 사용해야 합니다.
    그렇지만, "[]"안에서는 이 표현 규칙이 적용되지 않습니다. "[*\+?{}.]"는 "*\+?{}."문자 앞에 "\"를 사용하지 않아도 특별한 의미를 상실해서 있는 문자가 있는 그대로 사용됩니다.


    금액을 표현하는 유형 체크하기

    금액을 표현할 수 있는 4가지 방법("10000.00", "10,000.00", "10000", "10,000")이 있는데 어떤 유형으로 금액을 표현했는지를 검사하는 정규표현식을 알아보겠습니다.

    ^[1-9][0-9]*$


    위 표현식은 1~9중 하나의 숫자로 시작하고 0~9중 하나의 숫자를 한 번이상 사용해서 끝난 문자열을 체크합니다.
    그렇지만, 0을 제외하고 시작하기 때문에 "0"을 가리킬 수는 없습니다. 다음과 같이 하면 이 문제를 해결할 수 있습니다.

    ^(0|[1-9][0-9]*)$


    이렇게 하면 "0"도 가리킬 수 있습니다. 여기서 금액을 마이너스로 표현하였는지 검사하고 싶다면 다음과 같이 하면 됩니다.

    ^(0|-?[1-9][0-9]*)$


    다음과 같이하면 소수점을 포함한 유형을 가리킬 수 있습니다.

    ^[0-9]+(\.[0-9]+)?$ : "10", "10.1"과 같은 유형을 체크합니다.
    ^[0-9]+(\.[0-9]{2})?$ : "10", "10.11"과 같은 유형을 체크합니다.


    소수점 이하의 자리수를 유동적으로 표현하고자 한다면 다음과 같이 하면됩니다.

    ^[0-9]+(\.[0-9]{1,2})?$ : "10", "10.1", "10.11"과 같은 유형을 체크합니다.


    이제 천단위씩 ","로 끊어서 나타내는 유형을 검사하는 표현을 알아보겠습니다.

    ^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
        - "10", "10.1", "1,000.11"과 같은 유형을 체크합니다.


    위 표현으로는 "10000"와 같은 유형을 가리킬 수 없습니다. 금액을 표시할 수 있는 4가지 유형을 모두 가리키도록 하려면 아래와 같이 표현하면 됩니다.

    ^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(\.[0-9]{1,2})?$



  • 전자우편주소의 타당성 체크하기

    여러분은 e-mail을 가지고 있을 것입니다. 이것은 POP3에 접속하는 사용자 계정(@의 왼쪽 부분전체), @, 서버명 세부분으로 나눌 수 있습니다. 아마, 사용자 계정은 대·소문자, 숫자, ".", "-", "_"로 구성되어 있을 것입니다. 서버명의 경우에는 "_"가 제외됩니다.

    사용자 계정을 "."으로 시작하거나 끝내는 것은 올바르지 않습니다. 도메인명 역시 마찬가지입니다. 두 개의 연속적인 "."역시 사용할 ?없고 문자들 사이에 위치해야 합니다. 사용자 계정부분은 다음과 같은 표현으로 체크할 수 있습니다.

    ^[_a-zA-Z0-9-]+$


    이것은 "."을 체크하지 않기 때문에 다음과 같이 바꾸어 줍니다.

    ^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$


    위 표현을 보면 대문자와 소문자를 따로 구분해 놓았는데 나중에 프로그램을 작성할 때 eregi()라는 함수를 사용한다면 다음과 같은 표현으로 바꿀 수 있습니다.

    * 참고 : ereg()함수는 대문자와 소문자를 따로 구분해서 체크하지만 eregi()함수는
                 대,소문자를 구분하지 않고 체크합니다.

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


    서버명은 사용자 계정과 동일한 규칙을 가지지만 "_"는 사용될 수 없습니다. 따라서 다음과 같이 표현됩니다.

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


    위의 모든 표현들을 합쳐서 아래와 같이 나타내서 전자우편의 타당성을 검사 할 수 있습니다.

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


    아래에 위의 표현식을 이용해서 간단한 전자우편 체크페이지를 만들어 보겠습니다.

    다음에 e-mail.html이라고 불리는 전자우편 주소를 입력받을 폼을 만듭니다.

    <HTML>
    <BODY>
    <form method="post" action="./email_check">
    e-mail을 입력하세요 : <input type="text" name="email" value="e-mail
                                    체크"></td>
    <input type="submit" value="확인">
    </BODY>
    </HTML>


    다음에 email_check.php라고 불리는 전자우편 주소의 타당성을 검사할 페이지를 만듭니다.

    <?
    if(eregi("(^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$)", $email, $regs))
    {
    echo("사용 가능한 email입니다.");
    }
    else
    {
    echo("email을 잘못 입력하셨습니다. 다시 입력 해주세요");
    exit;
    }
    ?>



    <그림1-1 e-mail체크 From>


    <그림1-2 e-mail체크 결과>
  • 마치며...

    이번 강좌에서는 정규표현식에 대해 알아보았는데 이러한 정규표현식을 잘 사용한다면 사용자의 잘못된 입력에 의한 오류와 같은 것들을 미리 예방할 수 있을것입니다.
    다음 강좌에서는 MIME에 대해 알아보고 메일을 보낼 수 있는 방법에 대해서 알아 보도록 하겠습니다.


    =======================================================================================
  • http://korea.internet.com/channel/content.asp?nid=24288&cid=191#start
  • 브니 Programs/Web Programs

    01 14, 2007 03:15 01 14, 2007 03:15
    [로그인][오픈아이디란?]
    오픈아이디로만 댓글을 남길 수 있습니다