Q&A

정규식을 이용해 주소에서 필요한 부분을 추출하고 싶습니다.

2023.07.10 23:35
497
0
CMS/프레임워크 Rhymix 2.1
개발 언어 PHP 8.0

Case1 = 전라북도 익산시 남중동 12-34
Case2 = 전라북도 익산시 삼기면 용연리 56-789
Case3 = 경기도 고양시 덕양구 원당동 90-12

Case4 = 서울특별시 중구 남대문로1가 123-456

 

위와 같은 지번 주소에서 (시|군|구)와 (읍|면|동|가|통|리) 부분만 나누어서 추출하고 싶습니다.

 

원래는 explode를 이용하여 띄어쓰기를 기준으로 나누어 주려 했는데

생각해보니 주소 체계에 따라서 XX시 XX구 형식의 주소 및 XX면 XX리 같은 주소들이 있어서

주소마다 띄어쓰기 개수와 주소표현 순서가 다르기에 explode한 배열의 index 순서에 따라 나누는것은 불가능 할것 같습니다.

 

따라서 preg_match & 정규식을 이용하여 처리해야 될것 같습니다..

예를 들자면 아래와 같이 주소를 나누어 출력하고 싶습니다.


adr[0] = "익산시"  ,  adr[1] = "남중동"
adr[0] = "익산시"  ,  adr[1] = "삼기면 용연리"
adr[0] = "고양시 덕양구"  ,  adr[1] = "원당동"

adr[0] = "중구"  ,  adr[1] = "남대문로1가"

 

머리로는 띄어쓰기로 시작하여 특정한 값을 포함하거나 특정한 값으로 끝나면서 띄어쓰기로 끝나는 사이 문자열을

추출하면 될것 같다는 생각이 드는데.. 구글에서 정규식 표현법을 열심히 찾아보았지만

이게 외계어 인지...? 암호인지...?? 너무나 어려워서 머리가 깨질것만 같습니다...

 

참고로 주소의 경우 API를 이용하여 등록한 주소라서 오입력, 주소줄임 등의 표준 주소체계를 벗어나는 특이 케이스는 없고

"XX아파트 XXX" 등의 세부주소 또한 없습니다. (NN-NN 번지 형식으로 끝나는 only 지번주소)

 

 

혹시나 정규식 고수분 께서 계신다면 어떻게 원하는 부분을 추출해야 할지 조언좀 부탁 드리겠습니다.  ㅠㅠ

댓글 4

  • 2023.07.11 01:17 #1773952

    일단 쪼갠 후, 마지막 글자를 기준으로 분류하시면 됩니다.

    정규식까지도 필요없고, str_ends_with() 함수만 사용해도 충분히 분류 가능하죠.

     

    자, 이제 커브볼 들어갑니다.

    1. 동 이름이 "n가"로 끝나는 경우도 있습니다. 예: 서울 종로구 종로1가 17

    2. 구 밑에 읍면이 들어있는 경우도 있습니다. 예: 충북 충주시 서원구 현도면 죽암리 262

  • 2023.07.11 06:31 #1774029

    답변 감사드립니다 !!

    기진곰님 조언 덕분에 str_ends_with() 알게되어 제가 원하는 대로 구현 하였습니다.

     

    시군구-법정동 주소데이터 엑셀파일을 다운받아 살펴보니 지번주소를 split 하였을때

    경우의 수가 아래처럼 나오기에 조건문을 통하여 처리 하였습니다.

     

    경우의수.png

     

     

     


    <?php

    // 지번 주소 예시
    $adr_jibun= "서울 동대문구 장안동 102-8";

    // 건축물대장정보 API 조회
    $adr_split = extAdr($adr_jibun);

    // 함수 : 지번주소에서 시군구, 법정동 추출 (str_ends_with는 PHP8 부터 지원)
    function extAdr($val) {
    $val = explode(' ',$val);
    if ( str_ends_with($val[1], '동') ) {
      $adr['sigungu'] = $val[0];
      $adr['bjdong'] = $val[1];
    } else if ( str_ends_with($val[2], '리') ) {
      $adr['sigungu'] = $val[0];
      $adr['bjdong'] = $val[1]." ".$val[2];
    } else if ( str_ends_with($val[2], '가') || str_ends_with($val[2], '동') || str_ends_with($val[2], '로') ) {
      $adr['sigungu'] = $val[1];
      $adr['bjdong'] = $val[2];
    } else if ( str_ends_with($val[3], ')') || str_ends_with($val[3], '리') ) {
      $adr['sigungu'] = $val[1];
      $adr['bjdong'] = $val[2]." ".$val[3];
    } else if ( str_ends_with($val[3], '가') || str_ends_with($val[3], '동') ) {
      $adr['sigungu'] = $val[1]." ".$val[2];
      $adr['bjdong'] = $val[3];
    } else if ( str_ends_with($val[4], ')') || str_ends_with($val[4], '리') ) {
      $adr['sigungu'] = $val[1]." ".$val[2];
      $adr['bjdong'] = $val[3]." ".$val[4];
    }
    return $adr;
    }

    ?>

    <pre><?php print_r($adr_split) ?></pre>

     

    혹시나 비슷한 기능 개발하는데 필요하신분은 참고 하세요 ~ (함수가 엄청 지저분 하네요... ㅠㅠ)

     

     

    result.png

  • 2023.07.11 03:56 #1773977
    1. '시 '로 끝나는 부분을 찾으면 될 듯 합니다.
    2. '구 '가 있는 경우, 이걸 '시 '와 같은 레벨 단위로 묶습니다.
    3. 나머지 숫자로 시작되는 경우
    이렇게 끊으면 어떤가요.
  • 2023.07.11 06:35 #1774035
    답변 감사드립니다!!
    읍면동 단위의 경우 [ '동', '로', '가', '리', ')' ] 로 끝나길래 조건문을 통하여 해결 하였습니다!