স্ট্রিং থেকে হোস্টনামের নাম বের করুন


239

আমি কোনও টেক্সট স্ট্রিং থেকে পুরো URL টির সাথে একটি URL এর মূলের সাথে মিল রাখতে চাই match প্রদত্ত:

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

আমি 2 টি সর্বশেষ দৃষ্টান্তটি ডোমেন www.example.comবা example.comডোমেনে সমাধান করতে চাই ।

আমি শুনেছি রেজেক্সটি ধীর গতির এবং এটি পৃষ্ঠায় আমার দ্বিতীয় রেইগেক্স এক্সপ্রেশন হবে তাই যদি রেজেেক্স ছাড়াই এটি করার উপায় আছে তবে আমাকে জানান।

আমি এই সমাধানটির একটি জেএস / জিকুয়েরি সংস্করণ চাইছি।

উত্তর:


281

আমি এনপিএম প্যাকেজ পিএসএল (সর্বজনীন প্রত্যয় তালিকা) ব্যবহার করার পরামর্শ দিচ্ছি । "পাবলিক সফিক্স লিস্ট" হ'ল সমস্ত বৈধ ডোমেন প্রত্যয় এবং নিয়মের একটি তালিকা, কেবল দেশের কোড শীর্ষ-স্তরের ডোমেন নয়, তবে ইউনিকোড অক্ষরও যেটিকে মূল ডোমেন হিসাবে বিবেচনা করা হবে (যেমন www। 食 狮। C .cn, bckobe .jp ইত্যাদি)। এটি সম্পর্কে এখানে আরও পড়ুন

চেষ্টা করুন:

npm install --save psl

তারপরে আমার "এক্সট্রাক্ট হস্টনেম" প্রয়োগের সাথে:

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

আমি এনপিএম প্যাকেজটি ব্যবহার করতে পারি না, সুতরাং নীচে কেবল এক্সট্রাক্ট হোস্টনাম পরীক্ষা করে।

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"));

প্রোটোকল বা পোর্ট নম্বর থাকা সত্ত্বেও আপনি ডোমেনটি বের করতে পারেন। এটি একটি খুব সরলিকৃত, নন-রেজেক্স সমাধান, সুতরাং আমি মনে করি এটি করবে।

* আপনার পরামর্শের জন্য @ টিমারজ, @ রেনোইরব, @ রিনিজ, @ বিগডং, @ ra00l, @ আইলাইক বিয়ানস টাকোস, @ চার্লস রবার্টসনকে ধন্যবাদ! @ রস-অ্যালেন, বাগটি রিপোর্ট করার জন্য আপনাকে ধন্যবাদ!


3
কোনও প্রোটোকল নোটেশন দৈর্ঘ্য সমর্থন করা আরও ভাল। একটি উন্নতি হতে পারে url.split('/')[2]এর আমরা লিখতে নির্বিশেষে যেহেতু ftp, ftps, https, ডোমেন নাম সর্বদা সূচক 2. হতে হবে
renoirb

1
আপনার দৃশ্যের উপর নির্ভর করে আপনার return url.split('/')[2] || url.split('/')[0];কোনও প্রোটোকল না থাকলে কোনটির সাথে মেলে তা ব্যবহারের প্রয়োজন হতে পারে ।
টিমমার্জ

1
ছেলেরা এই সত্যটি কেন উপেক্ষা করছেন যে এই ফাংশনটি "ftp.websitename.com/dir/file.txt" এর মতো কিছু ইনপুটটির জন্য ডোমেন নামটি ফিরিয়ে দিতে ব্যর্থ হবে?
রিনিজ

1
@ রেনোইরব আমাকে ক্ষমা করবেন, এটি কিভাবে হাঁসের টাইপিংয়ের অনুসরণ করবে?
রিনিজ

6
একটি: youtube.com/watch -> www.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'

উপরের মতো কোনও ফাংশনে যেমন নীচের অংশে মুড়ে যান এবং আপনার নিজের একটি ইউআরআই থেকে ডোমেনের অংশটি ছিনিয়ে নেওয়ার দুর্দান্ত উপায় রয়েছে।

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

8
আসলে আমি পার্সিউরি সমাধানটি চেষ্টা করতে যাচ্ছি তবে সৃজনশীলতার জন্য +1 করছি।
চামিলিয়ান

11
@ চামিলিয়ান আমি মনে করি আপনার এই উত্তরটি গ্রহণ করা উচিত .. এটি অনেক বেশি শীতল এবং অতিরিক্ত কিছু ছাড়াই কাজ করে :)
লিপিস

3
শুধু fyi - এই সমাধানটি পোর্ট সংখ্যাগুলি পরিচালনা করে না
কাইল

1
@ কাইল এটি নিশ্চিত করে, যদি আপনি বোঝাচ্ছেন যে পোর্ট নম্বরটি একটি অংশ হওয়া উচিত তবে hostnameএটি করা উচিত নয়, যদি আপনি উভয় hostnameএবং উভয়ই অ্যাক্সেস করতে চান port(এবং এটি domain.sample:1234কেবল অ্যাক্সেস হিসাবে পান a.host)
ফিলিপ রোজন - রেপ

46
আপনার যদি এটি দ্রুত করার দরকার হয় তবে এটি ব্যবহার করবেন না । এটি গিলি 3 এর পদ্ধতির চেয়ে প্রায় 40-60 গুণ ধীর। জেএসপিফায় পরীক্ষিত: jsperf.com/hostname-from-url
cprcrack

137

স্ট্রিংকে বিশ্লেষণ করার দরকার নেই, কেবল আপনার URL টি URLনির্মাণকারীর পক্ষে যুক্তি হিসাবে পাস করুন :

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

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

6
নীচে @ এমসি দ্বারা উত্তর হিসাবে একই। এছাড়াও "নতুন ইউআরএল () আইই (পরীক্ষিত আইই 11) এর সাথে কাজ করে না" মন্তব্যটি একবার দেখুন।
চামিলিয়ান

2
সমাধান সহ কাজ করা সম্ভবত এটি সবচেয়ে সহজ, সুতরাং +1
চামিলিয়ান

1
আমি এটি ক্রোম এক্সটেনশনে ব্যবহার করছি, তাই কোনও আই সমর্থন আমার কাছে এই মুহুর্তের জন্য ভাল নয়।
বডাইন

1
+1 এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি দ্রুত, নির্ভরযোগ্য, সমস্ত আধুনিক ব্রাউজারগুলিতে কাজ করে, বাহ্যিক গ্রন্থাগারের উপর নির্ভর করে না এবং বোঝা সহজ (রেজেক্স সমাধানগুলির বিপরীতে)। আমি এটিকেও খুব দ্রুতই ধরে নেব যেহেতু এটি প্রতিটি ব্রাউজার যা করে তার মূল অংশে (সাধারণত এটি যদিও খুব বেশি গুরুত্বপূর্ণ তা নয়)।
জোহানোদো

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। সুতরাং, সঠিক Regex ভালো কিছু হওয়া উচিত: /^https?\:\/\/([^\/?#]+)/। তা ছাড়া, আপনি আমার +1 পাবেন (এটি দ্রুততম সমাধান)
রাজারজার্নার

2
আপনি (?:www\.)?নেতিবাচক চেহারাতে optionচ্ছিক যুক্ত করতে ইচ্ছুক হতে পারেন ।
রডগারুনার

3
+1 কারণ এটি অত্যন্ত দ্রুত, যা আমার ক্ষেত্রে প্রয়োজন
সিআরপ্রে্যাক

8
@ ফেলোস্ট্রেঞ্জার - এর (?:www\.)?মতো নিয়মিত প্রকাশে যুক্ত করুন:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
গিলি

36

একটি ইউআরএল পার্স করা জটিল হতে পারে কারণ আপনার পোর্ট নম্বর এবং বিশেষ অক্ষর থাকতে পারে। এর মতো, আপনার জন্য এটি করার জন্য আমি পার্সিউরির মতো কিছু ব্যবহার করার পরামর্শ দিচ্ছি । আমি সন্দেহ করি যে আপনি শত শত URL টি পার্স না করে পারফরম্যান্স একটি সমস্যা হয়ে উঠবে।


12
আপনার যদি এটি দ্রুত করার দরকার হয় তবে এটি ব্যবহার করবেন না । কেবল হোস্টনাম পাওয়ার জন্য, এটি গিলি 3 এর পদ্ধতির চেয়ে প্রায় 40-60 গুণ বেশি ধীর। জেএসপিফায় পরীক্ষিত: jsperf.com/hostname-from-url
cprcrack

এখানে একটি আপডেট URL টি (অন্যটি আয় 404 পাওয়া যায় নি) এর javascriptoo.com/application/html/js/franzenzenhofer/parseUri/...
ub3rst4r

@ বিগডং সম্ভবত আপনি সহজেই লাইব প্রয়োজন? nodejs.org/api/…
এমসি।

2
দুর্ভাগ্যক্রমে ইউআরএল IE10 এ সমর্থিত নয়।
এডভান্সড

1
URL()সম্পূর্ণরূপে সমর্থিত হয় না। চেক করুন: caniuse.com/#feat=url
কাউশা

33

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.hostnameঅংশ URL টি এপিআই , ইন্টারনেট (ছাড়া সমস্ত প্রধান ব্রাউজার দ্বারা সমর্থিত caniuse )। একটি ইউআরএল পলিফিল ব্যবহার করুনলিগ্যাসি ব্রাউজারগুলিকে সমর্থন করার প্রয়োজন হলে

এই সমাধানটি ব্যবহার করা আপনাকে অন্যান্য ইউআরএল বৈশিষ্ট্য এবং পদ্ধতিগুলিতে অ্যাক্সেসও দেবে । উদাহরণস্বরূপ, আপনি যদি URL এর প্যাথনাম বা কোয়েরি স্ট্রিং প্যারামগুলিও বের করতে চান তবে এটি কার্যকর হবে ।


পারফরম্যান্সের জন্য RegEx ব্যবহার করুন

URL.hostnameঅ্যাঙ্কর সলিউশন বা পার্সিউরি ব্যবহার করার চেয়ে দ্রুত । তবে এটি এখনও গিলি 3 এর রেজেক্সের তুলনায় অনেক ধীর :

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"));

এই jscreen এ নিজে পরীক্ষা করুন

আপনার যদি খুব বেশি সংখ্যক ইউআরএল প্রসেস করতে হয় (যেখানে পারফরম্যান্স ফ্যাক্টর হবে), পরিবর্তে আমি এই সমাধানটি ব্যবহার করার পরামর্শ দিচ্ছি। অন্যথায়, URL.hostnameপাঠযোগ্যতার জন্য বেছে নিন ।


15

আমি প্রদত্ত সমাধানগুলি ব্যবহার করার চেষ্টা করেছি, নির্বাচিতটি হ'ল আমার উদ্দেশ্যটির জন্য একটি ওভারকিল এবং "উপাদান তৈরি করা" আমার জন্য মিস করছিল।

এটি ইউআরএলে পোর্টের জন্য এখনও প্রস্তুত নয়। আমি আশা করি যে কেউ এটি দরকারী হবে

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
আমি সাধারণত কম ভোট দেওয়া উত্তরগুলি মিস করি তবে এই উত্তরটি আমাকে সাবধান করে তুলেছে। দুর্দান্ত কাজ! ধন্যবাদ @ ব্ল্যাকডাইভাইন
দেবারুপ

আমার প্রচেষ্টার প্রশংসা করার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ @ দেবারুপ
ব্ল্যাকডাইভাইন

15

যদি আপনি এই পৃষ্ঠায় শেষ হয়ে থাকেন এবং আপনি ইউআরএলএসের সেরা REGEX সন্ধান করছেন তবে এটি ব্যবহার করে দেখুন:

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

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

এটি ইউআরএলগুলির জন্য http: // ছাড়াই, HTTP সহ, https সহ, ​​কেবল // এর সাথে কাজ করে এবং পাশাপাশি পাথ এবং ক্যোয়ারী পথটি ধরবে না।

শুভকামনা


যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে। - পর্যালোচনা থেকে
লরেন্স আইলো

1
রেজেক্স সম্পাদিত ও জমা দিয়েছে :)
লুইস লোপস

6

সমস্ত ইউআরএল বৈশিষ্ট্য, কোনও নির্ভরতা নেই, কোন জিকুয়ারি নয়, বোঝা সহজ

এই সমাধানটি আপনার উত্তরটি অতিরিক্ত অতিরিক্ত বৈশিষ্ট্য দেয়। কোনও জিকুয়ারি বা অন্যান্য নির্ভরতা প্রয়োজন নেই, আটকান এবং যান।

ব্যবহার

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')এই পৃষ্ঠায় একটি কনসোল চেষ্টা করুন ।
চামিলিয়ান

@ চামিলিয়ান এটি কোনও url নয়, ইউআরএলগুলির একটি প্রোটোকল রয়েছে। তবে আমি আরও সাধারণ কেস পরিচালনা করার জন্য কোডটি আপডেট করেছি যাতে আপনার ডাউনটাতে ফিরে যান take
হোয়াইটনিল্যান্ড 21

আমি আপনাকে ভোট দেয় নি। তবে আমার কাছে যদি আমি বিশেষভাবে আমার মূল প্রশ্নটিতে http: // না চেয়ে থাকতাম।
চামিলিয়ান

2
@ লাইপ এই ইনপুটটিতে ব্যর্থ: var url="https://mail.gggg.google.cn/link/link/link";এটি domainrootহওয়া উচিত google.comতবে এটি আউটপুট হয়: gggg.google.cnযদিও এটি ggggএকটি সাব-ডোমেন (ডোমেনগুলিতে একাধিক সাব-ডোমেন থাকতে পারে)।
কেউই নয়


4

আজ এই সমস্যার সমাধান খুঁজছিল। উপরের কোনও উত্তর সন্তুষ্ট বলে মনে হয়নি to আমি এমন একটি সমাধান চাইছিলাম যা ওয়ান লাইনার হতে পারে, কোনও শর্তাধীন যুক্তি এবং কোনও ফাংশনে আবৃত থাকতে হবে এমন কিছুই নয়।

আমি এখানে যা এলাম তা এখানে খুব ভালভাবে কাজ করছে বলে মনে হচ্ছে:

হোস্ট-নেম = "http://www.example.com:1234"
হোস্টনাম.স্প্লিট ("//")। স্লাইস (-1) [0] .স্প্লিট (":") [0] .স্প্লিট ('।')। স্লাইস (-2) .জাইন ('।') // "উদাহরণ.com" দেয়

প্রথম নজরে জটিল দেখায়, তবে এটি বেশ সহজভাবে কাজ করে; কীটি 'স্লাইস (-n)' এমন কয়েকটি জায়গায় ব্যবহার করছে যেখানে ভাল অংশটি বিভক্ত অ্যারের শেষ থেকে টানতে হবে (এবং [0] বিভক্ত অ্যারের সামনের দিক থেকে পেতে)।

এই পরীক্ষার প্রতিটি "উদাহরণ.com" ফেরত দেয়:

"Http://example.com" .split ( "//") .slice (-1) [0] .split ( ":")। [0] .split ( '।') ফালি (-2)। যোগদানের ( '।')
"http://example.com:1234".split("//").slice(-1)[0].split(":")[0].split('.').slice(-2 ) .join ( '।')
"Http://www.example.com:1234" .split ( "//") .slice (-1) [0] .split ( ":") [0] .split ( '।') ফালি (। -2) .join ( '।')
"Http://foo.www.example.com:1234" .split ( "//") .slice (-1) [0] .split ( ":") [0] .split ( '।')। ফালি (-2) .join ( '।')

চমৎকার কারণ এটি এমন একটি মামলা পরিচালনা করে যেখানে www অপ্রাসঙ্গিক
চামিলিয়ান

4

এখানে jQuery ওয়ান-লাইনার:

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

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]+.)/,"");
}

সুতরাং আমি এখানে মন্তব্যগুলি যুক্ত করছি: সেই কোডটি url এর সাথেও কাজ করে যা // থেকে শুরু হয় বা qqq.qqq.qqq এবং পরীক্ষা = 2 এর মতো সিনট্যাক্স ত্রুটিযুক্ত রয়েছে বা URL এর সাথে ক্যোয়ারী পরম আছে? পরম
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];
}

উপরের কোডটি নিম্নলিখিত উদাহরণগুলির ইউআরএলগুলির জন্য হোস্টনামগুলি সফলভাবে পার্স করবে:

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 কোথাও ডটকম

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

আসল ক্রেডিট এতে যায়: http://www.primaryobjects.com/CMS/Article145


3

ঠিক আছে, আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি একটি সুপার-দক্ষ ইউআরএল পার্সার তৈরি করেছি তাই আমি ভেবেছিলাম এটি ভাগ করে নিই।

আপনি দেখতে পাচ্ছেন যে ফাংশনটির কাঠামোটি খুব অদ্ভুত, তবে এটি দক্ষতার জন্য। কোনও প্রোটোটাইপ ফাংশন ব্যবহার করা হয় না, স্ট্রিংটি একাধিকবার পুনরাবৃত্তি হয় না এবং কোনও অক্ষরও প্রয়োজনের চেয়ে বেশি প্রক্রিয়াজাত হয় না।

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

আমি এই সমাধানটির জন্য ব্যক্তিগতভাবে অনেকগুলি গবেষণা করেছি এবং আমি যে সর্বোত্তম খুঁজে পেতে পারি তা আসলে ক্লাউডফ্লেয়ারের "ব্রাউজার চেক" থেকে পাওয়া:

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, ''));

এটি উভয় প্রোটোকলের যত্ন নেয়।


প্রকৃতপক্ষে এই মডিউলটি নোডজেএস সরবরাহ করা হয়েছে।
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

1

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

অনুসরণ করুন ওপিতে রেগেক্সের কথা উল্লেখ করা হয়েছে এবং এটি স্পষ্টতই কোনও ইউআরএল এর অনুরোধিত অংশের সাথে মেলে ডিজাইনের একটি রেইগেক্স এক্সপ্রেশন। এটি সম্পূর্ণরূপে সঠিক নয় (যেমন www.সমস্ত ইউআরএলগুলির এই উপাদান না থাকলেও এটি প্রয়োজন ), তবে এটি অবশ্যই একটি উত্তর
কাইল স্ট্র্যান্ড

@ কাইলস্ট্র্যান্ড প্রেটি স্পষ্টতই একটি বিষয়গত রায়; "আমি এই সমাধানের একটি জেএস / জিকুয়েরি সংস্করণ চাইছি" যখন জিজ্ঞাসা করা হয়েছিল তখন কোনও কাঁচা রেগেক্স সরবরাহ করা এই প্রশ্নটির উত্তর দেয় না।
খ্রিস্টান টার্নাস

আমি ওপি। জেএস-এর বক্স সলিউশনটি খুঁজে বের করার সময় আমি একজন নতুন বিকাশকারী ছিলাম। প্রকৃতপক্ষে, কোনও প্রসঙ্গ ছাড়াই একটি কাঁচা রেজেক্স স্ট্রিং কিছুতেই সহায়তা করবে না। এছাড়াও এটি অসম্পূর্ণ।
চামিলিয়ান

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' ] }

কেন?

ব্যবহারের কেস এবং ভলিউমের উপর নির্ভর করে আমি নিজেই রেজেক্স বা অন্যান্য স্ট্রিং ম্যানিপুলেশন পদ্ধতি ব্যবহার করে এই সমস্যাটি সমাধান করার বিরুদ্ধে দৃ strongly়ভাবে সুপারিশ করি। এই সমস্যার মূল বিষয়টি হ'ল ইউআরএল স্ট্রিংগুলি ডোমেন এবং সাবডোমেনগুলিতে সঠিকভাবে পার্স করার জন্য আপনাকে সমস্ত জিটিএলডিড এবং সিসিটিএলটি প্রত্যয়গুলি জানতে হবে , এই প্রত্যয়গুলি নিয়মিত আপডেট হয়। এটি একটি সমাধান সমস্যা এবং আপনি নিজেরাই সমাধান করতে চান এমন নয় (আপনি গুগল বা কিছু না হলে)। আপনার যদি একটি চিম্টিতে হোস্টনাম বা ডোমেন নাম প্রয়োজন না হয় তবে এটিকে থেকে বেরিয়ে যাওয়ার পথটি চেষ্টা এবং বিশ্লেষণ করবেন না।


এটি সম্ভবত পরিবেশ / সংস্করণ সমস্যা এই এনপিএমজেএস.com
গ্লেন থম্পসন

-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
ওপি জাভাস্ক্রিপ্টে জাভা নয়, একটি উত্তর খুঁজছিল।
পাইর্সাদ্রিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.