정규표현식 의 핵심. 의미있는 메타 문자들 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,675
12년 전 조회 2,994
12년 전 조회 1,004
12년 전 조회 803
12년 전 조회 1,885
12년 전 조회 5,897
12년 전 조회 1,503
12년 전 조회 4,736
12년 전 조회 968
12년 전 조회 4,136
12년 전 조회 1,279
12년 전 조회 1,134
12년 전 조회 1,714
12년 전 조회 1,349
12년 전 조회 601
12년 전 조회 572
12년 전 조회 2만
12년 전 조회 540
12년 전 조회 1,103
12년 전 조회 1,110
12년 전 조회 1,353
12년 전 조회 3,500
12년 전 조회 735
12년 전 조회 2,238
12년 전 조회 4,919
12년 전 조회 689
12년 전 조회 3,878
12년 전 조회 1,068
12년 전 조회 3,796
12년 전 조회 945
13년 전 조회 1,792
13년 전 조회 960
13년 전 조회 2,184
13년 전 조회 7,969
13년 전 조회 1,955
13년 전 조회 1,750
13년 전 조회 1,566
13년 전 조회 625
13년 전 조회 2,145
13년 전 조회 1,874
13년 전 조회 661
13년 전 조회 1,229
13년 전 조회 643
13년 전 조회 933
13년 전 조회 1,221
13년 전 조회 3,607
13년 전 조회 2,140
13년 전 조회 2,329
13년 전 조회 3,697
13년 전 조회 3,510
13년 전 조회 3,169
13년 전 조회 4,039
13년 전 조회 1,050
13년 전 조회 6,014
13년 전 조회 1,404
13년 전 조회 1,245
13년 전 조회 3,430
13년 전 조회 3,061
13년 전 조회 5,216
13년 전 조회 2,720
13년 전 조회 3,366
13년 전 조회 1,056
13년 전 조회 879
13년 전 조회 2,049
13년 전 조회 839
13년 전 조회 2,241
13년 전 조회 1,542
13년 전 조회 1,147
13년 전 조회 2,134
13년 전 조회 2,345
13년 전 조회 1,341
13년 전 조회 823
13년 전 조회 1,371
13년 전 조회 857
13년 전 조회 1,244
13년 전 조회 3,886
13년 전 조회 3,978
13년 전 조회 1,394
13년 전 조회 6,986
13년 전 조회 7,577
13년 전 조회 2,337
13년 전 조회 3,887
13년 전 조회 659
13년 전 조회 3,693
13년 전 조회 3,516
13년 전 조회 2,752
13년 전 조회 2,851
13년 전 조회 2,383
13년 전 조회 2,277
13년 전 조회 5,200
13년 전 조회 2,843
13년 전 조회 3,158
13년 전 조회 2,284
13년 전 조회 6,855
13년 전 조회 2,591
13년 전 조회 3,454
13년 전 조회 2,349
13년 전 조회 4,837
13년 전 조회 3,710
13년 전 조회 2,568
🐛 버그신고