Advertisement
asimryu

초성검색예

Jun 29th, 2020
1,362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 4.47 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>초성검색</title>
  6. </head>
  7. <body>
  8.     <form>
  9.         <input type="text" onkeyup="schHangul(this.value)">
  10.     </form>
  11.     <div id="ul"></div>
  12.     <script>     
  13.         // 문자열 초성으로 변환
  14.         function cho(str){
  15.             var res = "", // 초성으로 변환
  16.             choArr = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"];
  17.             for (var i in str) {
  18.                 code = Math.floor((str[i].charCodeAt() - 44032) / 588)
  19.                 res += code >= 0 ? choArr[code] : str[i];
  20.             }
  21.             return res;
  22.         }
  23.  
  24.         var compars = ["홍길동", "한국", "호가든", "프로그램목록", "프로세스", "공통", "아키텍쳐", "앙칼지다", "학사행정", "일반부속", "학습 및 취업", "테이블정의서", "테이저건", "정의서", "현행화", "졸업", "바인더", "대학본부", "에디터", "Visual Studio Code", "Edit Plus", "소나무", "민들레", "나뭇가지", "갑천", "한강", "금강", "도안동", "월평동", "대전광역시", "서울", "경기도", "성남시", "모니터", "이클립스", "탐색기", "엑셀", "크롬", "파이어폭스", "텔레그램", "팟플레이어", "마이크로소프트", "애플", "LG", "삼성", "오라클", "MySQL", "치약", "프린터", "레이저 프린터", "아반떼", "베라크루즈", "자동차공학과", "기아자동차", "현대자동차", "에어컨"]; // 검색 데이터
  25.  
  26.         function schHangul(str) {
  27.             document.getElementById("ul").innerHTML = "";
  28.         searchArr = str, // 검색어
  29.         res = []; // 검색 결과
  30.  
  31.             var searchArr = searchArr.split('|');
  32.              
  33.             searchArr.forEach((search, t) => {
  34.              
  35.                 var searchCho = cho(search);
  36.              
  37.                 /*
  38.                     1. 검색어와 비교문자열 모두 초성으로 변환시킨다.
  39.                     2. 비교할 문자열에서 검색한 문자열이 포함될 수 있는 위치의 인덱스를 모두 구해온다.
  40.                     3. 구한 인덱스들을 반복 시키면서 비교문자열에서 해당 인덱스 위치 부터 검색어의 길이만큼 가져온다 -> 초성으로 바꾼 검색어와 같은 문자열이 나옴
  41.                     4. 검색어가 초성이 아닌 글자의 인덱스를 찾고
  42.                     5. 초성으로 변환한 비교 문자열의 위에서 나온 인덱스의 문자를 원본 비교문자로 치환
  43.                     6. 5번 결과의 문자열과 원본 검색어를 비교해 일치 시 반환
  44.                 */
  45.              
  46.                 compars.forEach((compare, i) => {
  47.              
  48.                     var compCho = cho(compare); // 비교문자의 초성
  49.                         strIdxs = [], // 비교문자열에서 검색어와 일치하는 부분의 시작 위치
  50.                         compare = compare.split(''); // 비교문자
  51.              
  52.                     for (var c in compCho) { // 검색어, 비교문자를 초성으로 변환후 일치하는 부분 모두 찾기
  53.                         /*
  54.                             쉽게말해
  55.                             비교할 문자 : ㄱㄱㄱㄱㄱㄱㄱ
  56.                             검색어 : ㄱㄱㄱㄱ일때
  57.                             검색어가 비교할 문자열에 몇번째 문자열에 포함될 수 있는지 모두 구해옴
  58.                             0,1,2,3 번째 문자열에 들어갈 수 있음
  59.                         */
  60.                         var idx = compCho.indexOf(searchCho, c); // 일치하는 부분의 인덱스
  61.              
  62.                         if (idx != -1 && strIdxs.indexOf(idx) == -1)
  63.                             strIdxs.push(idx);
  64.                     }
  65.                     chk = 0;
  66.                    
  67.                     strIdxs.forEach((idx, d) => {
  68.                        
  69.                         var str = searchCho.split('');
  70.              
  71.                         for (var e in search) {
  72.                             if (search[e].charCodeAt() - 44032 >= 0) // 검색어중에 초성이 아닌부분
  73.                                 str[e] = compare[idx + e * 1]; // 초성변환 전의 문자로 치환
  74.                         }
  75.              
  76.                         if (str.join('') == search) { // 비교문자
  77.                             chk = 1;
  78.                             for(var q = idx; q < idx + search.length; q++)
  79.                                 compare[q] = `<span style='background: yellow'>${compare[q]}</span>` // 비교문자 하이라이트
  80.                         }
  81.                     })            
  82.              
  83.                     if (chk)
  84.                         res.push(compare.join(''));
  85.                 })
  86.             })
  87.              
  88.             res.forEach((el, ix) => {
  89.                 document.getElementById("ul").innerHTML += "<li>"+el+"</li>"
  90.             })
  91.         }
  92.  
  93.  
  94.    //출처
  95.    /*
  96.    https://wmsttks.tistory.com/28
  97.     https://stove99.tistory.com/221
  98.    */
  99.  
  100.  
  101.     </script>
  102. </body>
  103. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement