정규표현식 Regular Expression
-어떠한 값이 특정한 형태를 갖는지 검사하는 도구
주로 폼에 입력된 데이터를 검사하기 위해 이용됨
예를들어, 숫자로 된 값만을 취하여 할때라거나,
이메일 주소가 형식에 맞는지 검사할때 등
문자열이 포함되어 있는가? ereg, eregi
-문자열에 어떤 문자가 포함되어 있는가를 검사하는 함수
저장될 변수 = ereg ("검사할문자", "검사대상문자열");
검사후 포함되어 있다면 TRUE
불포함이면 FALSE를 리턴한다.
<?
$a="abced";
echo ereg ("b", $a );
?>
결과는 1
<?
$a="abced";
echo ereg ("B", $a );
?>
결과는 없음
<?
$a="abced";
echo
eregi ("B", $a );
?>
결과는 1
->ereg는 대소문자를 구분하지만
eregi는 대소문자를 구분하지 않는다
시작과 끝 ^, $
^ - 문자열의 시작을 의미
$ - 문자열의 끝을 의미
<?
$a="abced";
echo eregi ("
^a", $a );
?>
결과는 1
<?
$a="abc";
echo ereg ("c
$", $a );
?>
결과는 1
대상문자열이
abc 일때 결과를 보자
^a - a로 시작하는 문자열 -> true
c
$ - c로 끝나는 문자열 -> true
^ab - ab로 시작하는문자열 -> true
abc - abc를 포함하는 문자열 ->true
^abc
$ - abc인 문자열 -> true
문자의 반복 *, +, ?
* - 0개 또는 1개이상
+ - 1개 또는 1개이상
? - 0개 또는 1개
abc* -> ab뒤에 c가 0개 또는 1개 이상이는 문자열을 말함 예>ab, abc, abcc, abccc.....
abc+ -> ab뒤에 c가 1개 또는 1개 이상있는 문자열 -> 예>abc,abcc, abccc....
abc? -> ab뒤에 c가 0개 또는 1개 있는 문자열 예> ab, abc
<?
$a="abccc";
echo ereg ("abc
*", $a );
?>
결과는 1
반복횟수의 지정 {}
*,+,? 대신 {}를 사용하여 문자의 반복을 결정해 줄 수 있다.
문자{최소개수, 최대개수}
예를들어
abc{1,2} 라고하였다면 ab뒤에 c가 1개 또는 2개가 있다는 것으로 abc, abcc를 의미함
여기서 최소 개수는 꼭 적어주어야 하지만 {1, }와 같이 최대 개수를 적어주지 않으면
1개또는 1개 이상을 뜻하게 되고
{3}과 같이 하나의 숫자만을 적어 주었다면 3개만을 나타나게 된다
연산자 |
{}로 표현 |
* |
{0, } |
+ |
{1, } |
? |
{0, 1} |
<?
$a="abccc";
echo ereg ("abc
{2,3
}", $a );
?>
결과는 1
문자열의 지정 ()
a 뒤에 bc 가 2개에서 3개 있는 문자열을 지정하기 위해서는 a(bc){2,3} 으로
b,c를 묶어준다.
<?
$a="abcbc";
echo ereg ("a
(bc
){2,3}", $a );
?>
결과는 1
OR연산 |
대상문자열이 abc 라고 할때
^a
| c$ - a로 시작하거나 c로 끝나는 문자열 ->true
^(ab)
| (bc)$ - ab로 시작하거나 bc로 끝나는 문자열 -> true
<?
$a="abc";
echo ereg ("^a
| b$", $a );
?>
결과는 1
어떤한문자 .
특정한 문자가 아닌 어떤 하나의 문자를 의미하는 연산자로 . 이 있다.
예를들어
.{3} 을 보면
.은 하나의 문자를 의미하므로 .{3}은 3개의 문자를 말한다.
그런데 .{3}이라고만 하면 3개의 문자를 포함한다는 얘기이므로 4개의 문자라도 true가 된다
그렇기에 정확히 3개의 문자로 지정하기 위해 ^와 $를 붙여준다
^
.{3}$
<?
$a="abc";
echo ereg ("^.{3}$", $a );
//3개의 문자로 구성된 문자열
?>
결과는 1
<?
$a="abcd";
echo ereg ("^a.{2}d$", $a );
//a와 d사이에 2개의 문자가 있는 문자열
?>
결과는 1
사용 가능한 문자열의 지정 []
예를들어 생년월일을 입력받는데 숫자로만 입력받고 싶다면?
또는 알파벳이나 특수문자를 구분하여 검사할때 사용하는 것이
[]이다.
[abc] - abc로만 이루어진 문자열
[a-c] - a에서 c까지의 문자로만 이루어진 문자열
[a-z] - a에서 z까지의 문자로만 이루어진 문자열
[A-Z] - A에서 Z까지의 문자로만이루어진 문자열
[a-zA-Z] - a에서 z까지와 A에서 Z까지의 문자로만 이루어진 문자열
[0-9] - 0에서 9까지의 문자로만 이루어진 문자열
[!@#_0-9] - !, @, #, _ 와 0에서 9까지의 문자로만 이루어진 문자열
<?
$a="a3";
echo ereg ("^[a-z][0-9]$", $a ); //
a에서 z사이의 한 문자로 시작하고 0에서 9사이의 한 숫자로 끝나는 문자열
?>
결과는 1
<?
$a="abc123";
echo ereg ("^[a-z]{3}[0-9]{3}$", $a );
//a에서 z사이의 문자 3개로 시작하고 0에서 9사이의 숫자 3개로 끝나는 문자열
?>
결과는 1
사용불가능한 문자열의 지정 [^]
[^abc] - a, b, c를 포함하지 않는 문자열
[^a-c] - a에서 c까지의 문자를 포함하지 않는 문자열
[^a-z] - a에서 z까지의 문자를 포함하지 않는 문자열
[^A-Z] - A에서 Z까지의 문자를 포함하지 않는 문자열
[^a-zA-Z] - a에서 z까지와 A에서 Z까지의 문자를 포함하지 않는 문자열
[^0-9] - 0에서 9까지의 숫자를 포함하지 않는 문자열
[^!@#_0-9] - !, @, #, _ 와 0에서 9까지의 숫자를 포함하지 않는 문자열
<?
$a="3a";
echo ereg ("^[^a-z][^0-9]$", $a );
//a에서 z사이의 한 문자로 시작하지 않고 0에서 9사이의 한 숫자로 끝나지 않는 문자열
?>
결과는 1
특수문자의 사용
?가 0개 또는 1개 있는 문자열을 검사한다면 다음과 같을 것이다.
??
위의 정규표현식을 검사하는 예제를 보자
<?
$a="3a";
echo ereg ("^[^a-z][^0-9]$", $a );
// ?가 0개 또는 1개있는 문자열
?>
결과는 에러발생
왜냐하면 ?가 특수문자가 아닌 연산자로 인식되기 때문
즉 ??라고 하면 ? 뒤에 ?연산자가 아니라,
?연산자를 두번 적은것으로 인식되기 때문에 에러가 발생하는 것
이렇게 ?를 연산자가 아닌 특수문자로 지정하기 위해서는 앞에 \를 붙여준다
?이외에도 ^ . [ $ ( ) | + { } \ 와 같은 문자를 연산자가 아닌 특수 문자로 사용하기 위해서는 앞에 \를 붙여주면 된다
그리고 []에 ]를 포함하기 위해서는
[]a-z]와 같이 ]를 가장 처음에 넣어주고,
-는 [-a-z]와 같이 가장 처음이나 [a-z-]와 같이 가장마지막에 넣어주면 된다
<?
$a="?";
echo ereg ("\??", $a );
//?가 0개 또는 1개가 있는 문자열
?>