정규표현식 의 핵심. 의미있는 메타 문자들 3

대단할것은 없는 강좌이지만,
제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.

강좌는 php 5. 대를 기준으로 하며, PCRE (펄과 호환 되는 정규표현식)을 다룹니다.
PCRE 는 preg_ 로 시작되는 내장함수와 함께 사용되어지는 정규표현식을 말합니다.

PCRE > 정규표현식 의 핵심. 의미있는 메타 문자들 3

이전 내용에서는 정규표현식의 메타문자인 ?, *, + 에 대해서 알아보았습니다.
이번 내용에서도 역시 정규표현식의 핵심이라고 볼수 있는 의미 있는 메타 문자에 대해서 이어서 알아보도록 하겠습니다.

7. {최소값,최대값}
이것은 바로 앞의 문자나 문자열의 반복의 범위 를 지정 합니다.
최소값 은 최소 반복횟수이며, 최대값 은 최대 반복횟수 입니다. 해당 반복횟수의 값은 정수를 사용합니다.
최소값 과 최대값 사이에는 쉼표(,)만 올수 있고, 공백(화이트 스페이스) 은 허용 되지 않습니다.

최대값 은 생략 가능 하며, 쉼표(,)를 같이 생략 할 때와 쉼표(,)는 사용하고 최대값만 생략 할 때 가 서로 다른 의미를 갖습니다.

{최소값} --> 최소값 만큼만 반복, == 의 의미
{최소값,} --> 최소값 이상 반복, >= 의 의미
{최소값,최대값} --> 최소값 이상, 최대값 이하 반복, 최소값 >= && 최대값 <= 의 의미

{,최대값} 형태는 올바른 형태가 아닙니다. 제대로 원하는 데로 매치 되지 않습니다.

예제11> test11.php

<?php

$strings = Array();
$strings[] = 'abcefg';//d가 없음
$strings[] = 'abcdefg';//d가 1
$strings[] = 'abcddefg';//d가 2
$strings[] = 'abcdddde';//d가 4
$strings[] = 'cddddddefg';//d가 6

foreach($strings as $string){

    //c 다음에 d 가 두번에서 네번까지 반복 된 후 e 가 있을 경우 매치
    if (preg_match('@cd{2,4}e@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    //c 다음에 d 가 두번 반복 된 후 e 가 있을 경우 매치
    if (preg_match('@cd{2}e@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @cd{2}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @cd{2}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    //c 다음에 d 가 두번 이상 반복 된 후 e 가 있을 경우 매치
    if (preg_match('@cd{2,}e@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @cd{2,}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @cd{2,}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    //잘못된 사용, 최소값은 생략될수 없다.
    if (preg_match('@cd{,4}e@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @cd{,4}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @cd{,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

?>


결과 :

abcefg 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcdefg 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcddefg 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdde
abcdddde 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdddde
cddddddefg 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.

abcefg 은 @cd{2}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcdefg 은 @cd{2}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcddefg 은 @cd{2}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdde
abcdddde 은 @cd{2}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
cddddddefg 은 @cd{2}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.

abcefg 은 @cd{2,}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcdefg 은 @cd{2,}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcddefg 은 @cd{2,}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdde
abcdddde 은 @cd{2,}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdddde
cddddddefg 은 @cd{2,}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdddddde

abcefg 은 @cd{,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcdefg 은 @cd{,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcddefg 은 @cd{,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcdddde 은 @cd{,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
cddddddefg 은 @cd{,4}e@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.

※ 위 예제에서 4번째 패턴 @cd{,4}e@ 은 정상적인 사용법이 아니므로, 매치되는 것이 하나도 없는 것입니다.
위에서 설명하였듯이 {,최대값} 형태로는 사용할수 없습니다.



8. [문자문자문자.....]
이것은 하나의 문자에 대하여 매치 하고자 하는 모든 경우의 문자를 지정 합니다.
일명 문자클래스(묶음) 이라고 합니다.

[] 안에 아무리 많은 문자를 지정하더라도 [] 는 하나의 문자만 매치합니다.
즉, 매치시킬 어떤 문자에 대해 구체적으로 [] 에 나열 하여, 대상 문자열에서 나열한 문자중 하나가 있을 경우 매치시키는 것입니다.

좀 알기 쉽게 비교하자면,
어떤 $var 라는 변수에 문자 하나만 할당할수 있다라고 가정하고, 그 $var 변수에 할당 가능한 문자들을 [] 안에 지정하는 것 이라고 볼 수 있습니다.

[] 안의 문자들의 연결은 공백(화이트스페이스) 를 쓰지 않습니다.
매치시킬 문자중 공백이 포함될 경우에만 한번 입력할수 있습니다.

예제12> test12.php

<?php

$strings = Array();
$strings[] = 'abcfghi';
$strings[] = 'abcdefg';
$strings[] = 'abcddefg';
$strings[] = 'abcdddde';
$strings[] = 'abccghijk';

foreach($strings as $string){

    //c 다음에 def 중 하나가 있고 다음에 g 가 있을 경우 매치
    if (preg_match('@c[def]g@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @c[def]g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @c[def]g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    //c 다음에 def 중 하나가 없거나 있고 다음에 g 가 있을 경우 매치
    if (preg_match('@c[def]*g@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @c[def]*g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @c[def]*g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    //c 다음에 def 중 하나가 하나 이상 있고 다음에 g 가 있을 경우 매치
    if (preg_match('@c[def]+g@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @c[def]+g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @c[def]+g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

echo '<br />' . PHP_EOL;

foreach($strings as $string){

    //c 다음에 def 중 하나가 없거나 하나 있고 다음에 g 가 있을 경우 매치
    if (preg_match('@c[def]?g@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 @c[def]?g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 @c[def]?g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.</font><br />' . PHP_EOL;
    }
}

?>


결과 :

abcfghi 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cfg
abcdefg 은 @c[def]g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcddefg 은 @c[def]g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcdddde 은 @c[def]g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abccghijk 은 @c[def]g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.

abcfghi 은 @c[def]*g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cfg
abcdefg 은 @c[def]*g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdefg
abcddefg 은 @c[def]*g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cddefg
abcdddde 은 @c[def]*g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abccghijk 은 @c[def]*g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cg

abcfghi 은 @c[def]+g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cfg
abcdefg 은 @c[def]+g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cdefg
abcddefg 은 @c[def]+g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cddefg
abcdddde 은 @c[def]+g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abccghijk 은 @c[def]+g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.

abcfghi 은 @c[def]?g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cfg
abcdefg 은 @c[def]?g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcddefg 은 @c[def]?g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abcdddde 은 @c[def]?g@ 패턴에 매치되는 문자열을 포함하지 않는 문자열 입니다.
abccghijk 은 @c[def]?g@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> cg



9. [문자-문자]
이것은 [] 내에서 - 양옆 문자의 범위(range)에 속하는 모든 문자를 뜻 합니다.

즉, - 은 [] 내에서 양옆에 - 을 제외한 문자가 있을 때 에만 의미 를 갖는 메타 문자입니다. 그외의 경우나 [] 밖에서는 그냥 문자 그대로 입니다.

내장함수 range 의 결과와 같다고 볼수 있습니다.

[0-9] --> [0123456789] --> print_r(range('0','9'));
[a-z] --> [abcdefghijklmnopqrstuvwxyz] --> print_r(range('a','z'));
[A-Z] --> [ABCDEFGHIJKLMNOPQRSTUVWXYZ] --> print_r(range('A','Z'));
[0-9a-zA-Z] -->[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ] --> print_r(array_merge(range('0','9'), range('a','z'), range('A','Z')));

등과 같이 표현합니다.

아래의 예제는 사용자로 부터 입력받은 아이디가 올바른지 체크 하는 것 입니다.
예제13> test13.php

<?php

$strings = Array();
$strings[] = 'dbckdghk';
$strings[] = "dbckdghk1";
$strings[] = "DBCKDGHK2";
$strings[] = "dbck@dghk";
$strings[] = '9_dbckdghk';
$strings[] = 'dbc';
$strings[] = 'dbckdghkdbckdghk';

foreach($strings as $string){

    //아이디는 알파벳소문자, 숫자, _ 를 사용하여 4 자에서 10자 사이만 가능하다.
    if (preg_match('@^[0-9a-z_]{4,10}$@', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 정상적인 아이디입니다.</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 정상적인 아이디가 아닙니다.</font><br />' . PHP_EOL;
    }
}

?>


결과 :

dbckdghk 은 정상적인 아이디입니다.
dbckdghk1 은 정상적인 아이디입니다.
DBCKDGHK2 은 정상적인 아이디가 아닙니다.
dbck@dghk 은 정상적인 아이디가 아닙니다.
9_dbckdghk 은 정상적인 아이디입니다.
dbc 은 정상적인 아이디가 아닙니다.
dbckdghkdbckdghk 은 정상적인 아이디가 아닙니다.



10. [^문자문자문자.....]
이것은 [] 내에서 맨 처음에 ^ 를 사용함으로서 그다음 나오는 문자들을 제외한 하나의 문자를 의미 합니다.

이전 내용에서도 설명하였듯이 ^ 은 [] 밖 에서는 패턴 맨처음에 위치하여 문자열의 시작 시점을 의미 하므로, [] 내 에서의 의미와 [] 외 에서의 의미를 혼돈하지 않아야 합니다.


아래의 예제는 사용자로 부터 입력받은 이메일이 올바른지 체크 하는 것 입니다.
예제13> test13.php

<?php

$strings = Array();
$strings[] = 'dbckdghk1@nate.com';
$strings[] = "DBCKDGHK2@yahoo.co.kr";
$strings[] = "dbckdghk1@dbckdghk2@naver.com";
$strings[] = 'dbckdghk1.dbckdghk2@naver.com';
$strings[] = "DBCKDGHK@i-boss.co.kr";

foreach($strings as $string){

    //이메일은 @ 를 기준으로 아이디와 서버로 구분된다. 아이디에는 @ 와 . 은 올수 없으며 4자이상이다. 서버에는 알파벳 소문자와 숫자 - .으로 3 자 이상으로 구성 되어있다.
    if (preg_match('/^[^@.]{4,}@[0-9a-z-.]{3,}$/', $string, $matches)) {

        echo '<font color="blue">' . $string . ' 은 정상적인 이메일입니다.</font><br />' . PHP_EOL;
    }
    else {

        echo '<font color="red">' . $string . ' 은 정상적인 이메일이 아닙니다.</font><br />' . PHP_EOL;
    }
}

?>


결과 :

dbckdghk1@nate.com 은 정상적인 이메일입니다.
DBCKDGHK2@yahoo.co.kr 은 정상적인 이메일입니다.
dbckdghk1@dbckdghk2@naver.com 은 정상적인 이메일이 아닙니다.
dbckdghk1.dbckdghk2@naver.com 은 정상적인 이메일이 아닙니다.
DBCKDGHK@i-boss.co.kr 은 정상적인 이메일입니다.

※ 위 예제에서 사용된 패턴 /^[^@.]{4,}@[0-9a-z-.]{3,}$/ 을 가만히 살펴보면, [^@.] 와 같은 부분이 있습니다.

이전 내용에서 . 을 의미있는 메타문자 로서가 아니라, 문자 . 그대로로 쓰기 위해서는 에스케이프(\.) 해야 한다 고 했는데, 여기서는 에스케이프 하지 않고 사용하였습니다.

이유는 [] 로 정의된 문자 클래스에서는 ^ 나 - 를 제외한 어떠한 메타문자도 문자 그대로로 취급합니다.
그러므로 에스케이프 하지 않아도 됩니다.

그러면, [] 내 에서의 ^ 과 - 는 문자로서는 어떻게 구분하냐고 생각하실지 모릅니다.

^ 은 [] 내 에서 맨처음에 위치하고 다음에 어떤 문자가 존재 할 경우 에만 이하 제외하고 의 의미 를 가지고, 그 외의 경우 에서는 그냥 문자 그대로의 ^ 을 의미합니다.

- 은 [] 내 에서 - 제외한 문자가 양옆에 위치하면, 두 문자 사이의 모든 문자를 의미 하고, 그 외의 경우는 문자 그대로 - 을 의미합니다.

[0-9a-z-.] 에서 보면 0-9 와 a-z 에서는 범위를 가리키는 의미 이고 z-. 에서의 - 은 그냥 문자 그대로의 - 입니다.
z가 이미 앞의 범위를 표시하는 데에 사용되었기 때문입니다.

구분이 애매한 경우에는 에스케이프 시켜서 z\-. 와 같이 써도 무방합니다.
|

댓글 18개

강좌를 너무 잘해주셔서 고맙습니다.
이번주에 시간내서 정독 해야겟습니다.^^
네에 감사합니다 ^^
조금씩 명확해져 가네요.
감사합니다.
네에 ㅎㅎ 다행입니다.
고맙습니다.
//c 다음에 def 중 하나가 있고 다음에 g 가 있을 경우 매치
if (preg_match('@c[def]g@', $string, $matches)) {

echo '<font color="blue">' . $string . ' 은 @cd{2,4}e@ 패턴에 매치되는 문자열을 포함한 문자열 입니다. --> ' . $matches[0] . '</font><br />' . PHP_EOL;
}
else {

@cd{2,4}e@가 아니라 @c[def]g@네요.
예제 12 번에 오타가 있엇네요
감사합니다.
유창화님 글을 보다보니 궁금한게 있는데요.

if (preg_match('@cd{2,4}e@', $string, $matches)) {

이런식으로 /가 아니라 @를 쓰셨는데 그 이유가 뭔가요?ㅠㅠ
네에
첫강 http://sir.co.kr/bbs/board.php?bo_table=pg_lecture&wr_id=156&sca=&sfl=&stx=&spt=0&page=1 에 보시면 상세하게 설명 되어있습니다.

정규표현식에서 구분자는 1byte 특수문자는 아무거나 쓸수 있습니다.
저같은 경우는 패턴에 들어올 내용에 포함되지 않는 것을 구분자로 쓰는 경우가 많습니다.

웹페이지 파싱를 주로 많이 하다 보니 패턴에 / 가 들어오는 경우가 많아서 /은 구분자로 잘 안쓰는 편입니다.

패턴에 나오는 문자를 구분자로 쓰게 되면 로 에스케이프 시켜줘야 하기 때문입니다.

예) /https?:\/\// == @https?://@

감사합니다.
아...그렇군요ㅎㅎ
오늘도 하나 배워가네요! 감사해요
네 고맙습니다.
헐... SMaker 님이 여기 계시네...
네? 혹시 저 아세요?
XE 에 계신분 아니세요? ㅋ
헉! 저를 알아보시다니^^
강좌 잘 봤습니다 감사합니다 ^^
이메일 같은 경우에는 aaa@bbb 처럼 뒷부분이 도메인이 아닌경우도 있을수 있으니
실제로 사용할때는 그 부분도 체크를 해줘야겠군요 ^^
네에 감사합니다.
예제는 진도에 맞춰서 만들어집니다.
감사합니다. 잘 봤습니다.
머리가 나빠 몇 일째 봅니다. 감사합니다. @c[def]?g@ 하면 c다음에 def준 하나가 없거나 있고 다음에 g가 오는 경우가 참이네요.
겨우 이해했습니다.ㅠㅠ 감사합니다. ^^
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
12년 전 조회 2,670
12년 전 조회 2,990
12년 전 조회 995
12년 전 조회 793
12년 전 조회 1,881
12년 전 조회 5,889
12년 전 조회 1,497
12년 전 조회 4,730
12년 전 조회 960
12년 전 조회 4,127
12년 전 조회 1,271
12년 전 조회 1,131
12년 전 조회 1,710
12년 전 조회 1,345
12년 전 조회 594
12년 전 조회 566
12년 전 조회 2만
12년 전 조회 532
12년 전 조회 1,099
12년 전 조회 1,103
12년 전 조회 1,344
12년 전 조회 3,492
12년 전 조회 731
12년 전 조회 2,235
12년 전 조회 4,910
12년 전 조회 683
12년 전 조회 3,871
12년 전 조회 1,060
12년 전 조회 3,789
12년 전 조회 940
13년 전 조회 1,789
13년 전 조회 953
13년 전 조회 2,178
13년 전 조회 7,966
13년 전 조회 1,950
13년 전 조회 1,741
13년 전 조회 1,560
13년 전 조회 622
13년 전 조회 2,137
13년 전 조회 1,870
13년 전 조회 658
13년 전 조회 1,225
13년 전 조회 638
13년 전 조회 930
13년 전 조회 1,218
13년 전 조회 3,603
13년 전 조회 2,137
13년 전 조회 2,320
13년 전 조회 3,694
13년 전 조회 3,506
13년 전 조회 3,162
13년 전 조회 4,034
13년 전 조회 1,044
13년 전 조회 6,009
13년 전 조회 1,400
13년 전 조회 1,238
13년 전 조회 3,427
13년 전 조회 3,059
13년 전 조회 5,210
13년 전 조회 2,718
13년 전 조회 3,359
13년 전 조회 1,047
13년 전 조회 873
13년 전 조회 2,046
13년 전 조회 833
13년 전 조회 2,237
13년 전 조회 1,539
13년 전 조회 1,143
13년 전 조회 2,130
13년 전 조회 2,341
13년 전 조회 1,337
13년 전 조회 818
13년 전 조회 1,366
13년 전 조회 854
13년 전 조회 1,239
13년 전 조회 3,879
13년 전 조회 3,970
13년 전 조회 1,389
13년 전 조회 6,983
13년 전 조회 7,575
13년 전 조회 2,332
13년 전 조회 3,886
13년 전 조회 657
13년 전 조회 3,689
13년 전 조회 3,510
13년 전 조회 2,746
13년 전 조회 2,842
13년 전 조회 2,378
13년 전 조회 2,276
13년 전 조회 5,197
13년 전 조회 2,837
13년 전 조회 3,154
13년 전 조회 2,277
13년 전 조회 6,852
13년 전 조회 2,585
13년 전 조회 3,448
13년 전 조회 2,343
13년 전 조회 4,836
13년 전 조회 3,707
13년 전 조회 2,567
🐛 버그신고