정규표현식 의 핵심. 의미있는 메타 문자들 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,667
12년 전 조회 2,989
12년 전 조회 989
12년 전 조회 789
12년 전 조회 1,879
12년 전 조회 5,887
12년 전 조회 1,495
12년 전 조회 4,728
12년 전 조회 957
12년 전 조회 4,121
12년 전 조회 1,268
12년 전 조회 1,127
12년 전 조회 1,704
12년 전 조회 1,341
12년 전 조회 591
12년 전 조회 566
12년 전 조회 2만
12년 전 조회 529
12년 전 조회 1,098
12년 전 조회 1,100
12년 전 조회 1,342
12년 전 조회 3,488
12년 전 조회 730
12년 전 조회 2,233
12년 전 조회 4,909
12년 전 조회 680
12년 전 조회 3,870
12년 전 조회 1,052
12년 전 조회 3,785
12년 전 조회 937
13년 전 조회 1,785
13년 전 조회 951
13년 전 조회 2,177
13년 전 조회 7,963
13년 전 조회 1,949
13년 전 조회 1,737
13년 전 조회 1,559
13년 전 조회 620
13년 전 조회 2,135
13년 전 조회 1,867
13년 전 조회 656
13년 전 조회 1,218
13년 전 조회 636
13년 전 조회 925
13년 전 조회 1,212
13년 전 조회 3,602
13년 전 조회 2,136
13년 전 조회 2,319
13년 전 조회 3,691
13년 전 조회 3,503
13년 전 조회 3,160
13년 전 조회 4,030
13년 전 조회 1,042
13년 전 조회 6,005
13년 전 조회 1,396
13년 전 조회 1,235
13년 전 조회 3,427
13년 전 조회 3,057
13년 전 조회 5,209
13년 전 조회 2,718
13년 전 조회 3,358
13년 전 조회 1,044
13년 전 조회 872
13년 전 조회 2,043
13년 전 조회 833
13년 전 조회 2,236
13년 전 조회 1,535
13년 전 조회 1,139
13년 전 조회 2,126
13년 전 조회 2,338
13년 전 조회 1,334
13년 전 조회 811
13년 전 조회 1,362
13년 전 조회 851
13년 전 조회 1,236
13년 전 조회 3,876
13년 전 조회 3,970
13년 전 조회 1,387
13년 전 조회 6,981
13년 전 조회 7,573
13년 전 조회 2,332
13년 전 조회 3,880
13년 전 조회 656
13년 전 조회 3,686
13년 전 조회 3,506
13년 전 조회 2,743
13년 전 조회 2,842
13년 전 조회 2,375
13년 전 조회 2,275
13년 전 조회 5,196
13년 전 조회 2,836
13년 전 조회 3,151
13년 전 조회 2,276
13년 전 조회 6,850
13년 전 조회 2,583
13년 전 조회 3,446
13년 전 조회 2,342
13년 전 조회 4,836
13년 전 조회 3,705
13년 전 조회 2,566
🐛 버그신고