본문 바로가기
  • keep calm and carry on
기타

#카카오톡 링크 인식 분석[코드]

by geekseong 2019. 4. 14.

[실험] 편에서 카카오톡에서 링크를 보낼경우 링크로 인식하는 경우를 테스트 해 보았고, 나 규칙을 다시 한번 정리하면 다음과 같다.

 

1) 1, 2, 3, 4 번으로 보아 프로토콜(http(s)) 가 있던 없던 링크로 인식한다.

2) 4번, 5번으로 보아,  마지막에 올 수 있는 도메인이 명확하게 있다.

3) 6번, 7번으로 보아, 링크 앞에 딸린 특수문자는 제외하고 링크로 인식

4) 9번으로 보아, 도메인 마지막의 특수문자는 제외하고 링크로 인식

5) 10,번, 11번으로 보아 - 한개는 링크로 인식, --는 링크로 인식하지 않는다.

6) ₩~!@#$%^&*()+-=;':",.<>? 의 특수문자가 나오는경우 앞에 특수문자 전까지만 링크로 인식

7) _가 나올경우는 전체를 문자로 인식

8) /가 나오는경우 /뒤 전체를 포함하여 링크로 인식.

 

이제 위 규칙을 따라서  URL 이 입력으로 들어왔을때 링크로 인식하는 부분만 출력하는 프로그램을 만들어 보자.

이와같은 문제를 해결하는데 유용한 도구인 정규식을 써서 구현해보도록하겠다.

 

만약 위 규칙을 모두 if ... else  분기문으로 해결 한다고 하면 ... (판단은 독자들에게 맡기겠음😅)

const topLevelDomains = "(com|net|io|kr|ai|shop|co|tech|pro|org|cn|xyz|biz|info|jp|in|so)";
const linkReg = new RegExp('^(https?:\\/\\/)?(?:[\\/:\\~!@#$%^&\\*()-]*)?((([a-zA-Z0-9-]+[.])+'+topLevelDomains+')([/][a-zA-Z0-9+&@?%=_.]+)*)');

 

위의 한줄로 위 규칙을 적용한 코드를 작성하였다. 

한줄에 너무 많은 내용이 포함되어 있기 때문에 이해할수 있는 단위로 쪼개서 보도록 하자

 

1. ^(https?\\/\\/)? 

    => http:// 혹은  https://로 시작하거나 존재하지 않거나.

 

2. (?:[\\/:\\~!@#$%^&\\*()-]*)? 

    => \\/:\\~!@#$%^&\\*()- 특수문자들이 복수개 존재하거나 존재 하지 않거나.

    => 맨앞 ?: 는 비그룹화 시킨다는 뜻.

 

3.([a-zA-Z0-9-]+[.])+topLevelDomains

    => (문자열.) 조합 + 명시된 최상위 도메인만 올 수 있음

 

4. ([/][a-zA-Z0-9?=]*)*

    => 뒤에 /문자열 or 쿼리스트링 이 복수개 올 수 있음.

 

 

#테스트

 

아래 11가지의 URL 을 가지고 실험 하였다.

let url1 = "https://www.naver.com";
let url2 = "http://www.naver.com";
let url3 = "www.naver.com";
let url4 = "naver.com";
let url5 = "///naver.com";
let url6 = "/naver.com";
let url7 = '^^*//www.naver.com';
let url8 = '^^*//--38-naver.com';
let url9 = '^^*//--38-naver.com(*&^';
let url10 = 'asd.asd.asd.asd.com';
let url11 = 'naver.com/asd/asd?a=10';

const topLevelDomains = "(com|net|io|kr|ai|shop|co|tech|pro|org|cn|xyz|biz|info|jp|in|so)";
const linkReg = new RegExp('^(https?:\\/\\/)?(?:[\\/:\\~!@#$%^&\\*()-]*)?((([a-zA-Z0-9-]+[.]){1,4}'+topLevelDomains+')([/][a-zA-Z0-9+&?%=_.]+)*)');

let result = httpReg.exec(url1);
let result2 = httpReg.exec(url2);
let result3 = httpReg.exec(url3);
let result4 = httpReg.exec(url4);
let result5 = httpReg.exec(url5);
let result6 = httpReg.exec(url6);
let result7 = httpReg.exec(url7);
let result8 = httpReg.exec(url8);
let result9 = httpReg.exec(url9);
let result10 = httpReg.exec(url10);
let result11 = httpReg.exec(url11);

console.log(result[2]);		// www.naver.com
console.log(result2[2]);	// www.naver.com
console.log(result3[2]);	// www.naver.com
console.log(result4[2]);	// naver.com
console.log(result5[2]);	// naver.com
console.log(result6[2]);	// naver.com
console.log(result7[2]);	// www.naver.com
console.log(result8[2]);	// 38-naver.com
console.log(result9[2]);	// 38-naver.com
console.log(result10[2]);	// asd.asd.asd.asd.com
console.log(result11[2]);	// naver.com/asd/asda=10

 

 

'기타' 카테고리의 다른 글

#카카오톡 링크 인식 분석[실험]  (0) 2019.04.14
# 카카오톡 링크 인식 분석[발견]  (0) 2019.04.14

댓글