문자열에서 호스트 이름 이름 추출


239

텍스트 문자열의 전체 URL이 아닌 URL의 루트와 일치시키고 싶습니다. 주어진:

http://www.youtube.com/watch?v=ClkQA2Lb_iE
http://youtu.be/ClkQA2Lb_iE
http://www.example.com/12xy45
http://example.com/random

www.example.com또는 2 개의 마지막 인스턴스를 example.com도메인으로 해결하려고 합니다.

나는 정규 표현식이 느리다는 것을 들었고 이것이 페이지의 두 번째 정규 표현식이 될 것이므로 정규 표현식없이 할 수 있다면 알려주십시오.

이 솔루션의 JS / jQuery 버전을 찾고 있습니다.

답변:


281

npm 패키지 psl (Public Suffix List)을 사용하는 것이 좋습니다 . "공개 접미사 목록"은 국가 코드 최상위 도메인뿐만 아니라 루트 도메인으로 간주 될 유니 코드 문자 (예 : www. 食 狮. 公司 .cn, bckobe)의 모든 유효한 도메인 접미사 및 규칙 목록입니다. .jp 등). 자세한 내용은 여기를 참조 하십시오 .

시험:

npm install --save psl

그런 다음 "extractHostname"구현으로 다음을 실행하십시오.

let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com

npm 패키지를 사용할 수 없으므로 아래에서 extractHostname 만 테스트하십시오.

function extractHostname(url) {
    var hostname;
    //find & remove protocol (http, ftp, etc.) and get hostname

    if (url.indexOf("//") > -1) {
        hostname = url.split('/')[2];
    }
    else {
        hostname = url.split('/')[0];
    }

    //find & remove port number
    hostname = hostname.split(':')[0];
    //find & remove "?"
    hostname = hostname.split('?')[0];

    return hostname;
}

//test the code
console.log("== Testing extractHostname: ==");
console.log(extractHostname("http://www.blog.classroom.me.uk/index.php"));
console.log(extractHostname("http://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("https://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("ftps://ftp.websitename.com/dir/file.txt"));
console.log(extractHostname("websitename.com:1234/dir/file.txt"));
console.log(extractHostname("ftps://websitename.com:1234/dir/file.txt"));
console.log(extractHostname("example.com?param=value"));
console.log(extractHostname("https://facebook.github.io/jest/"));
console.log(extractHostname("//youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("http://localhost:4200/watch?v=ClkQA2Lb_iE"));

프로토콜이나 포트 번호가 있더라도 도메인을 추출 할 수 있습니다. 이것은 매우 단순화 된 비 정규식 솔루션이므로 그렇게 할 것이라고 생각합니다.

* 귀하의 제안에 대해 @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson에게 감사드립니다! @ ross-allen, 버그를보고 해 주셔서 감사합니다!


3
프로토콜 표기법 길이도 지원하는 것이 좋습니다. 개선 사항은 다음 과 같습니다. ,,에 url.split('/')[2]관계없이 도메인 이름은 항상 인덱스 2입니다.ftpftpshttps
renoirb

1
시나리오에 따라 return url.split('/')[2] || url.split('/')[0];프로토콜이없는 경우 일치하는 항목 을 사용해야 할 수도 있습니다 .
Timmerz

1
왜이 함수가 "ftp.websitename.com/dir/file.txt"와 같은 입력에 대해 도메인 이름을 반환하지 못한다는 사실을 무시하고 있습니까?
rineez

1
@renoirb 실례합니다, 오리 타이핑은 어떻게됩니까?
rineez

6
하나 : youtube.com/watch- > www.youtube.com은 youtube.com 도메인의 www 하위 도메인입니다. 여분의 www를 제거하기 위해 다음을 추가했습니다.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
ra00l

306

정규 표현식을 사용하지 않는 깔끔한 트릭 :

var tmp        = document.createElement ('a');
;   tmp.href   = "http://www.example.com/12xy45";

// tmp.hostname will now contain 'www.example.com'
// tmp.host will now contain hostname and port 'www.example.com:80'

위와 같은 함수로 위를 감싸면 도메인 부분을 URI에서 빼내는 가장 좋은 방법이 있습니다.

function url_domain(data) {
  var    a      = document.createElement('a');
         a.href = data;
  return a.hostname;
}

8
실제로 나는 parseUri 솔루션을 시도하지만 창의력을 위해 +1을 시도 할 것입니다.
Chamilyan

11
난 당신이 대답을 수용해야한다고 생각 @Chamilyan .. 그것은 :) 훨씬 쿨러의 아무것도의 추가없이 작동
리 피스

3
단지 fyi-이 솔루션은 포트 번호를 처리하지 않습니다
Kyle

1
그것은 확실하지 @Kyle, 당신은 암시하는 경우 포트 번호 의 일부가되어야 hostname당신이 모두에 액세스하려면, 그것은해야하지, hostnameport(와로 얻을 domain.sample:1234단지 액세스 a.host)
필립 Roséen - refp

46
빨리해야한다면 이것을 사용하지 마십시오 . gilly3의 방법보다 약 40-60 배 느립니다. jsperf에서 테스트되었습니다 : jsperf.com/hostname-from-url .
cprcrack

138

문자열을 구문 분석 할 필요가 없으며 URL을 URL생성자에 인수로 전달하면됩니다 .

var url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
var hostname = (new URL(url)).hostname;

assert(hostname === 'www.youtube.com');

6
아래 @mc의 답변과 동일합니다. 또한 "새로운 URL ()이 IE (테스트 된 IE11)와 작동하지 않습니다")라는 주석을 살펴보십시오.
Chamilyan

2
솔루션으로 작업하는 것이 가장 쉬운 방법이므로 +1
Chamilyan

1
크롬 확장 프로그램에서 이것을 사용하고 있으므로 현재 IE 지원이 제대로 지원되지 않습니다.
bodine

1
+1 이것은 정답입니다. 빠르고 신뢰할 수 있으며 모든 최신 브라우저에서 작동하며 외부 라이브러리에 의존하지 않으며 (정규 솔루션과 달리) 이해하기 쉽습니다. 또한 모든 브라우저가 수행하는 작업의 핵심이기 때문에 매우 빠르다고 가정합니다 (일반적으로 중요하지는 않습니다).
johndodo

128

이 시도:

var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
var domain = matches && matches[1];  // domain will be null if no match is found

결과에서 포트를 제외하려면이 표현식을 대신 사용하십시오.

/^https?\:\/\/([^\/:?#]+)(?:[\/:?#]|$)/i

편집 : 특정 도메인이 일치하지 않도록하려면 부정적 예측을 사용하십시오.(?!youtube.com)

/^https?\:\/\/(?!(?:www\.)?(?:youtube\.com|youtu\.be))([^\/:?#]+)(?:[\/:?#]|$)/i

3
같은 프로토콜로 형식에 대해 잊지 마세요 : // 사용자 이름 : 암호 @ 호스트 : 포트 / 경로 /로 / 자원 ...
앤드류 화이트

1
닫기는하지만 URL에 경로가 없을 수 있으며 호스트 부분은 ?' (query) or #`(조각)으로 끝날 수 있습니다 . 예를 들어 http://example.com?var=val또는 http://example.com#fragment. 따라서 올바른 정규식은 다음과 같아야합니다 /^https?\:\/\/([^\/?#]+)/. 그외에, 당신은 나의 +1을 얻을 것입니다 (이것이 가장 빠른 해결책입니다)
ridgerunner

2
(?:www\.)?제외 예측에 선택 사항을 추가 할 수 있습니다 .
ridgerunner

3
하나는 내 경우에 요구되는, 매우 빠른 때문에
cprcrack가

8
@FellowStranger-다음 (?:www\.)?과 같은 정규 표현식에 추가하십시오 ./^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
gilly3

36

포트 번호와 특수 문자를 사용할 수 있으므로 URL 구문 분석이 까다로울 수 있습니다. 따라서 parseUri 와 같은 것을 사용 하여이 작업 을 수행하는 것이 좋습니다 . 수백 개의 URL을 구문 분석하지 않으면 성능이 문제가 될 것입니다.


12
빨리해야한다면 이것을 사용하지 마십시오 . 호스트 이름을 얻으려면 gilly3의 방법보다 약 40-60 배 느립니다. jsperf에서 테스트되었습니다 : jsperf.com/hostname-from-url .
cprcrack

다음은 업데이트 된 URL입니다 (다른 하나는 404를 찾을 수 없음) : javascriptoo.com/application/html/js/franzenzenhofer/parseUri/…
ub3rst4r

@BigDong 어쩌면 쉽게 lib를 요구할 수 있습니까? nodejs.org/api/…
mc.

2
불행히도 URL은 IE10에서 지원되지 않습니다.
advncd

1
URL()아직 완전히 지원되지 않습니다. 확인 : caniuse.com/#feat=url
Kousha

34

2020 답변

이에 대한 추가 종속성이 필요하지 않습니다! 성능을 최적화해야하는지 여부에 따라 두 가지 좋은 솔루션이 있습니다.

URL.hostname가독성을 위해 사용

바벨 시대에 가장 깨끗하고 쉬운 해결책은를 사용하는 것 URL.hostname입니다.

const getHostname = (url) => {
  // use URL constructor and return hostname
  return new URL(url).hostname;
}

// tests
console.log(getHostname("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostname("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

URL.hostnameURL API의 일부이며 IE ( caniuse )를 제외한 모든 주요 브라우저에서 지원됩니다 . 레거시 브라우저를 지원해야하는 경우 URL 폴리 필을 사용하십시오 .

이 솔루션을 사용하면 다른 URL 속성 및 메소드에 액세스 할 수도 있습니다 . 예를 들어 URL의 경로 이름 또는 쿼리 문자열 params 도 추출하려는 경우에 유용합니다 .


성능을 위해 RegEx 사용

URL.hostname앵커 솔루션 또는 parseUri를 사용하는 것보다 빠릅니다 . 그러나 여전히 gilly3의 정규 표현식 보다 훨씬 느립니다 .

const getHostnameFromRegex = (url) => {
  // run against regex
  const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
  // extract hostname (will be null if no match is found)
  return matches && matches[1];
}

// tests
console.log(getHostnameFromRegex("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostnameFromRegex("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

jsPerf에서 직접 테스트하십시오.

많은 수의 URL을 처리해야하는 경우 (성능이 중요한 경우)이 솔루션을 대신 사용하는 것이 좋습니다. 그렇지 않으면 URL.hostname가독성을 선택하십시오 .


15

나는 주어진 솔루션을 사용하려고 시도했는데, 선택된 솔루션은 내 목적을 위해 과잉이었고 "요소 만들기"는 나를 엉망으로 만듭니다.

아직 URL에 포트가 준비되지 않았습니다. 누군가가 유용하다고 생각하기를 바랍니다.

function parseURL(url){
    parsed_url = {}

    if ( url == null || url.length == 0 )
        return parsed_url;

    protocol_i = url.indexOf('://');
    parsed_url.protocol = url.substr(0,protocol_i);

    remaining_url = url.substr(protocol_i + 3, url.length);
    domain_i = remaining_url.indexOf('/');
    domain_i = domain_i == -1 ? remaining_url.length - 1 : domain_i;
    parsed_url.domain = remaining_url.substr(0, domain_i);
    parsed_url.path = domain_i == -1 || domain_i + 1 == remaining_url.length ? null : remaining_url.substr(domain_i + 1, remaining_url.length);

    domain_parts = parsed_url.domain.split('.');
    switch ( domain_parts.length ){
        case 2:
          parsed_url.subdomain = null;
          parsed_url.host = domain_parts[0];
          parsed_url.tld = domain_parts[1];
          break;
        case 3:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2];
          break;
        case 4:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2] + '.' + domain_parts[3];
          break;
    }

    parsed_url.parent_domain = parsed_url.host + '.' + parsed_url.tld;

    return parsed_url;
}

이것을 실행 :

parseURL('https://www.facebook.com/100003379429021_356001651189146');

결과:

Object {
    domain : "www.facebook.com",
    host : "facebook",
    path : "100003379429021_356001651189146",
    protocol : "https",
    subdomain : "www",
    tld : "com"
}

1
나는 보통 낮은 투표 답변을 그리워하지만이 답변은 나를 조심스럽게 만들었습니다. 잘 작동합니다! 감사합니다 @BlackDivine
Devaroop

내 노력 @Devaroop
BlackDivine

15

이 페이지가 끝나고 최고의 REGEX를 찾고 있다면 다음 중 하나를 시도하십시오.

^(?:https?:)?(?:\/\/)?([^\/\?]+)

https://regex101.com/r/pX5dL9/1

http : //없이 URL, http로, https로, //로만 작동하며 경로 및 쿼리 경로도 가져 가지 마십시오.

행운을 빕니다


이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다. - 검토에서
로렌스 Aiello

1
편집 및 정규식 : submited
루이스 로페스

6

모든 URL 속성, 종속성 없음, JQuery 없음, 이해하기 쉬운

이 솔루션은 답변과 추가 속성을 제공합니다. JQuery 또는 다른 종속성이 필요하지 않습니다. 붙여 넣습니다.

용법

getUrlParts("https://news.google.com/news/headlines/technology.html?ned=us&hl=en")

산출

{
  "origin": "https://news.google.com",
  "domain": "news.google.com",
  "subdomain": "news",
  "domainroot": "google.com",
  "domainpath": "news.google.com/news/headlines",
  "tld": ".com",
  "path": "news/headlines/technology.html",
  "query": "ned=us&hl=en",
  "protocol": "https",
  "port": 443,
  "parts": [
    "news",
    "google",
    "com"
  ],
  "segments": [
    "news",
    "headlines",
    "technology.html"
  ],
  "params": [
    {
      "key": "ned",
      "val": "us"
    },
    {
      "key": "hl",
      "val": "en"
    }
  ]
}

코드
코드는 매우 빠르기보다는 이해하기 쉽도록 설계되었습니다. 초당 100 번 쉽게 호출 할 수 있으므로 프런트 엔드 또는 몇 가지 서버 사용에는 적합하지만 대량 처리량에는 적합하지 않습니다.

function getUrlParts(fullyQualifiedUrl) {
    var url = {},
        tempProtocol
    var a = document.createElement('a')
    // if doesn't start with something like https:// it's not a url, but try to work around that
    if (fullyQualifiedUrl.indexOf('://') == -1) {
        tempProtocol = 'https://'
        a.href = tempProtocol + fullyQualifiedUrl
    } else
        a.href = fullyQualifiedUrl
    var parts = a.hostname.split('.')
    url.origin = tempProtocol ? "" : a.origin
    url.domain = a.hostname
    url.subdomain = parts[0]
    url.domainroot = ''
    url.domainpath = ''
    url.tld = '.' + parts[parts.length - 1]
    url.path = a.pathname.substring(1)
    url.query = a.search.substr(1)
    url.protocol = tempProtocol ? "" : a.protocol.substr(0, a.protocol.length - 1)
    url.port = tempProtocol ? "" : a.port ? a.port : a.protocol === 'http:' ? 80 : a.protocol === 'https:' ? 443 : a.port
    url.parts = parts
    url.segments = a.pathname === '/' ? [] : a.pathname.split('/').slice(1)
    url.params = url.query === '' ? [] : url.query.split('&')
    for (var j = 0; j < url.params.length; j++) {
        var param = url.params[j];
        var keyval = param.split('=')
        url.params[j] = {
            'key': keyval[0],
            'val': keyval[1]
        }
    }
    // domainroot
    if (parts.length > 2) {
        url.domainroot = parts[parts.length - 2] + '.' + parts[parts.length - 1];
        // check for country code top level domain
        if (parts[parts.length - 1].length == 2 && parts[parts.length - 1].length == 2)
            url.domainroot = parts[parts.length - 3] + '.' + url.domainroot;
    }
    // domainpath (domain+path without filenames) 
    if (url.segments.length > 0) {
        var lastSegment = url.segments[url.segments.length - 1]
        var endsWithFile = lastSegment.indexOf('.') != -1
        if (endsWithFile) {
            var fileSegment = url.path.indexOf(lastSegment)
            var pathNoFile = url.path.substr(0, fileSegment - 1)
            url.domainpath = url.domain
            if (pathNoFile)
                url.domainpath = url.domainpath + '/' + pathNoFile
        } else
            url.domainpath = url.domain + '/' + url.path
    } else
        url.domainpath = url.domain
    return url
}

아주 간단한 파싱에서 실패합니다. getUrlParts('www.google.com')이 페이지의 콘솔에서 시도 하십시오.
Chamilyan

@Chamilyan URL이 아닙니다. URL에는 프로토콜이 있습니다. 그러나 더 일반적인 경우를 처리하기 위해 코드를 업데이트 했으므로 downvote를 다시 가져옵니다.
whitneyland

난 당신을 투표하지 않았다. 그러나 원래 질문에 http : //를 구체적으로 요구하지 않았다면 좋을 것입니다.
Chamilyan

2
@Lee이 입력에 실패 var url="https://mail.gggg.google.cn/link/link/link";domainroot있어야 google.com하지만 출력한다 : gggg.google.cn(가) 중에 gggg서브 - 도메인은 (여러 도메인의 서브 도메인을 가질 수있다).
없음


4

오늘이 문제에 대한 해결책을 찾고있었습니다. 위의 답변 중 어느 것도 만족시키지 못했습니다. 나는 하나의 라이너가 될 수 있고 조건부 논리가없고 함수에 싸여서는 안되는 솔루션을 원했습니다.

여기에 내가 생각해 낸 것이 실제로 잘 작동하는 것 같습니다.

hostname = "http://www.example.com:1234"
hostname.split ( "//"). slice (-1) [0] .split ( ":") [0] .split ( '.'). slice (-2) .join ( '.') // "example.com"제공

언뜻보기에는 복잡해 보일 수 있지만 간단하게 작동합니다. 핵심은 분할 배열 의 에서 좋은 부품을 가져와야하는 두 곳에서 'slice (-n)'을 사용하는 것입니다 (그리고 분할 배열의 앞쪽에서 가져 오려면 [0]).

각 테스트는 "example.com"을 반환합니다.

"http://example.com".split ( "//") .slice (-1) [0] .split ( ":") [0] .split ( '.'). slice (-2). 붙다('.')
"http://example.com:1234".split("//").slice(-1)[0].split(":")[0].split('.').slice(-2 ).붙다('.')
"http://www.example.com:1234".split ( "//") .slice (-1) [0] .split ( ":") [0] .split ( '.'). slice ( -2) .join ( '.')
"http://foo.www.example.com:1234".split ( "//") .slice (-1) [0] .split ( ":") [0] .split ( '.'). 슬라이스 (-2) .join ( '.')

www가 관련이없는 경우를 처리하기 때문에 좋았습니다
Chamilyan


3
String.prototype.trim = function(){return his.replace(/^\s+|\s+$/g,"");}
function getHost(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    var _host,_arr;
    if(-1<url.indexOf("://")){
        _arr = url.split('://');
        if(-1<_arr[0].indexOf("/")||-1<_arr[0].indexOf(".")||-1<_arr[0].indexOf("\?")||-1<_arr[0].indexOf("\&")){
            _arr[0] = _arr[0].trim();
            if(0==_arr[0].indexOf("//")) _host = _arr[0].split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
            else return "";
        }
        else{
            _arr[1] = _arr[1].trim();
            _host = _arr[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        }
    }
    else{
        if(0==url.indexOf("//")) _host = url.split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        else return "";
    }
    return _host;
}
function getHostname(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHost(url).split(':')[0];
}
function getDomain(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHostname(url).replace(/([a-zA-Z0-9]+.)/,"");
}

그래서 여기에 주석을 추가하십시오 : 그 코드는 //에서 시작하거나 qqq.qqq.qqq & test = 2와 같은 구문 오류가 있거나? param = www.www
QazyCat

3
function hostname(url) {
    var match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i);
    if ( match != null && match.length > 2 && typeof match[2] === 'string' && match[2].length > 0 ) return match[2];
}

위의 코드는 다음 예제 URL의 호스트 이름을 성공적으로 구문 분석합니다.

http://WWW.first.com/folder/page.html first.com

http://mail.google.com/folder/page.html mail.google.com

https://mail.google.com/folder/page.html mail.google.com

http://www2.somewhere.com/folder/page.html?q=1 somewhere.com

https://www.another.eu/folder/page.html?q=1 another.eu

최초 크레딧 : http://www.primaryobjects.com/CMS/Article145


3

좋아, 나는 이것이 오래된 질문이라는 것을 알고 있지만, 매우 효율적인 URL 파서를 만들었으므로 공유 할 것이라고 생각했다.

보시다시피, 함수의 구조는 매우 이상하지만 효율성을위한 것입니다. 프로토 타입 함수가 사용되지 않고 문자열이 두 번 이상 반복되지 않으며 필요한 것 이상으로 문자가 처리되지 않습니다.

function getDomain(url) {
    var dom = "", v, step = 0;
    for(var i=0,l=url.length; i<l; i++) {
        v = url[i]; if(step == 0) {
            //First, skip 0 to 5 characters ending in ':' (ex: 'https://')
            if(i > 5) { i=-1; step=1; } else if(v == ':') { i+=2; step=1; }
        } else if(step == 1) {
            //Skip 0 or 4 characters 'www.'
            //(Note: Doesn't work with www.com, but that domain isn't claimed anyway.)
            if(v == 'w' && url[i+1] == 'w' && url[i+2] == 'w' && url[i+3] == '.') i+=4;
            dom+=url[i]; step=2;
        } else if(step == 2) {
            //Stop at subpages, queries, and hashes.
            if(v == '/' || v == '?' || v == '#') break; dom += v;
        }
    }
    return dom;
}

3

이것은 완전한 대답은 아니지만 아래 코드가 도움이 될 것입니다.

function myFunction() {
    var str = "https://www.123rf.com/photo_10965738_lots-oop.html";
    matches = str.split('/');
    return matches[2];
}

내 것보다 코드를 더 빨리 작성하고 싶습니다. 그것은 나 자신도 향상시키는 데 도움이됩니다.


3

jquery와 함께 한 줄

$('<a>').attr('href', document.location.href).prop('hostname');

2
// use this if you know you have a subdomain
// www.domain.com -> domain.com
function getDomain() {
  return window.location.hostname.replace(/([a-zA-Z0-9]+.)/,"");
}

2

개인적으로이 솔루션에 대해 많은 연구를했으며 실제로 찾을 수있는 가장 좋은 방법은 CloudFlare의 "브라우저 확인"입니다.

function getHostname(){  
            secretDiv = document.createElement('div');
            secretDiv.innerHTML = "<a href='/'>x</a>";
            secretDiv = secretDiv.firstChild.href;
            var HasHTTPS = secretDiv.match(/https?:\/\//)[0];
            secretDiv = secretDiv.substr(HasHTTPS.length);
            secretDiv = secretDiv.substr(0, secretDiv.length - 1);
            return(secretDiv);  
}  

getHostname();

변수를 다시 작성하여 "사람이 읽을 수 있도록"읽을 수 있지만 예상보다 더 잘 수행합니다.


2

정규 표현식을 사용하는 것이 훨씬 쉽습니다.

    mainUrl = "http://www.mywebsite.com/mypath/to/folder";
    urlParts = /^(?:\w+\:\/\/)?([^\/]+)(.*)$/.exec(mainUrl);
    host = Fragment[1]; // www.mywebsite.com

2
import URL from 'url';

const pathname = URL.parse(url).path;
console.log(url.replace(pathname, ''));

이것은 두 프로토콜을 모두 처리합니다.


실제로이 모듈은 NodeJS와 함께 제공됩니다.
djibe

1

짧은 방법으로 당신은 이렇게 할 수 있습니다

var url = "http://www.someurl.com/support/feature"

function getDomain(url){
  domain=url.split("//")[1];
  return domain.split("/")[0];
}
eg:
  getDomain("http://www.example.com/page/1")

  output:
   "www.example.com"

위의 기능을 사용하여 도메인 이름을 얻습니다.


무엇이 문제입니까?
uzaif

문제는 슬래시가 없으면 작동하지 않는다는 것입니다.
툴킷

귀하의 경우에는 확인해야 할 ?도메인 이름 문자열과 대신 return domain.split("/")[0]; 이 넣어 return domain.split("?")[0];작동 희망
uzaif


0

암호:

var regex = /\w+.(com|co\.kr|be)/ig;
var urls = ['http://www.youtube.com/watch?v=ClkQA2Lb_iE',
            'http://youtu.be/ClkQA2Lb_iE',
            'http://www.example.com/12xy45',
            'http://example.com/random'];


$.each(urls, function(index, url) {
    var convertedUrl = url.match(regex);
    console.log(convertedUrl);
});

결과:

youtube.com
youtu.be
example.com
example.com

@ChristianTernus 반대로; OP는 정규 표현식을 언급했으며 이는 URL의 요청 된 부분과 일치하도록 설계된 정규 표현식입니다. 그것은 전적으로 아니라 올바른 (예를 들면이 필요 www.없는 모든 URL이 구성 요소를하더라도), 그러나 그것은 확실히이다 대답 .
Kyle Strand

@KyleStrand 예쁜 분명히 주관적인 판단이다; "이 솔루션의 JS / jQuery 버전을 찾고 있습니다"라는 질문에 원시 정규 표현식을 제공해도 qeustion에 응답하지 않습니다.
Christian Ternus

저는 OP입니다. JS에서 즉시 사용 가능한 솔루션을 찾고 있던 새로운 개발자였습니다. 실제로 컨텍스트가없는 원시 정규식 문자열은 전혀 도움이되지 않았습니다. 또한 불완전합니다.
Chamilyan

0

구문 분석 도메인 -매우 견고한 경량 라이브러리

npm install parse-domain

const { fromUrl, parseDomain } = require("parse-domain");

실시 예 1

parseDomain(fromUrl("http://www.example.com/12xy45"))
{ type: 'LISTED',
  hostname: 'www.example.com',
  labels: [ 'www', 'example', 'com' ],
  icann:
   { subDomains: [ 'www' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'www' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

실시 예 2

parseDomain(fromUrl("http://subsub.sub.test.ExAmPlE.coM/12xy45"))
{ type: 'LISTED',
  hostname: 'subsub.sub.test.example.com',
  labels: [ 'subsub', 'sub', 'test', 'example', 'com' ],
  icann:
   { subDomains: [ 'subsub', 'sub', 'test' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'subsub', 'sub', 'test' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

왜?

유스 케이스와 볼륨에 따라 정규식이나 다른 문자열 조작 수단을 사용 하여이 문제를 직접 해결하지 않는 것이 좋습니다. 이 문제의 핵심은 URL 문자열을 도메인 및 하위 도메인으로 올바르게 구문 분석하기 위해 모든 gtld 및 cctld 접미사 를 알아야한다는 것 입니다. 이러한 접미사는 정기적으로 업데이트됩니다. 이것은 해결 된 문제이며 자신이 해결하려는 것이 아닙니다 (Google 또는 다른 사람이 아닌 한). 꼬집음에 호스트 이름이나 도메인 이름이 필요하지 않으면이 이름에서 벗어나려고 시도하지 마십시오.


그것의 아마 환경 / 버전 문제는 이것 좀 걸릴 npmjs.com/package/parse-domain을
글렌 톰슨

-1

내 코드는 다음과 같습니다. 정규 표현식은 여러 형태로 나올 수 있으며 여기에 더 확장 가능한 것으로 생각되는 테스트 사례가 있습니다.

function extractUrlInfo(url){
  let reg = /^((?<protocol>http[s]?):\/\/)?(?<host>((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])|[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)))(\:(?<port>[0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/
  return reg.exec(url).groups
}

var url = "https://192.168.1.1:1234"
console.log(extractUrlInfo(url))
var url = "/programming/8498592/extract-hostname-name-from-string"
console.log(extractUrlInfo(url))


-6

정규식을 사용하여 정확한 도메인 이름을 보려면 아래 코드를 시도하십시오.

문자열 줄 = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";

  String pattern3="([\\w\\W]\\.)+(.*)?(\\.[\\w]+)";

  Pattern r = Pattern.compile(pattern3);


  Matcher m = r.matcher(line);
  if (m.find( )) {

    System.out.println("Found value: " + m.group(2) );
  } else {
     System.out.println("NO MATCH");
  }

2
OP는 Java가 아닌 JavaScript로 답을 찾고있었습니다.
piersadrian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.