প্রদত্ত ইউআরএল থেকে ডোমেনের নাম পান


130

একটি ইউআরএল দেওয়া হয়েছে, আমি ডোমেন নামটি বের করতে চাই (এতে 'www' অংশটি অন্তর্ভুক্ত করা উচিত নয়)। ইউআরএলটিতে http / https থাকতে পারে। আমি যে জাভা কোডটি লিখেছি তা এখানে। যদিও এটি ঠিকঠাক কাজ করেছে বলে মনে হচ্ছে, এর চেয়ে আরও ভাল কোনও পদ্ধতির রয়েছে বা কিছু প্রান্তের ঘটনা রয়েছে যা ব্যর্থ হতে পারে।

public static String getDomainName(String url) throws MalformedURLException{
    if(!url.startsWith("http") && !url.startsWith("https")){
         url = "http://" + url;
    }        
    URL netUrl = new URL(url);
    String host = netUrl.getHost();
    if(host.startsWith("www")){
        host = host.substring("www".length()+1);
    }
    return host;
}

ইনপুট: http://google.com/blah

আউটপুট: গুগল.কম


3
চেষ্টা করুন http://74.125.226.70এবং আমাকে তা কীভাবে কার্যকর হয় তা জানতে দিন :)
মারভিন পিন্টো

1
এটি কেবল আইপি ঠিকানা প্রদান করে। 74.125.226.70
এলোমেলো প্রশ্ন

2
এবং কীভাবে আপনি এটি থেকে ডোমেন নাম পাবেন ? ধরে নিলেন আপনি যা করছেন তার পরে ..
মারভিন পিন্টো

5
উদাহরণস্বরূপ http://www.de/বা http://www.com/পছন্দসই ফলাফল দেবে না।
মাইকেল কোনিয়েটজকা

উত্তর:


287

আপনি যদি কোনও URL টি বিশ্লেষণ করতে চান তবে ব্যবহার করুন java.net.URIjava.net.URLএকগুচ্ছ সমস্যা রয়েছে - এর equalsপদ্ধতিটি একটি ডিএনএস সন্ধান করে যার অর্থ কোডটি অবিশ্বস্ত ইনপুটগুলির সাথে ব্যবহারের সময় পরিষেবা আক্রমণগুলিকে অস্বীকারের পক্ষে ঝুঁকির হতে পারে।

"মিঃ গোসলিং - আপনি ইউআরএল সমান স্তন্যপান করলেন কেন?" এরকম একটি সমস্যা ব্যাখ্যা করে java.net.URIপরিবর্তে ব্যবহার করার অভ্যাস পেতে ।

public static String getDomainName(String url) throws URISyntaxException {
    URI uri = new URI(url);
    String domain = uri.getHost();
    return domain.startsWith("www.") ? domain.substring(4) : domain;
}

আপনি যা চান তা করা উচিত


যদিও এটি ঠিকঠাক কাজ করেছে বলে মনে হচ্ছে, এর চেয়ে আরও ভাল কোনও পদ্ধতির রয়েছে বা কিছু প্রান্তের ঘটনা রয়েছে যা ব্যর্থ হতে পারে।

লিখিত হিসাবে আপনার কোড বৈধ URL গুলি ব্যর্থ:

  • httpfoo/bar- যে পথ দিয়ে শুরু হয় তার সাথে সম্পর্কিত ইউআরএল http
  • HTTP://example.com/ - প্রোটোকল কেস-সংবেদনশীল।
  • //example.com/ - হোস্ট সহ প্রোটোকল সম্পর্কিত ইউআরএল
  • www/foo - কোনও পথ উপাদান দিয়ে শুরু হওয়া একটি সম্পর্কিত URL URL www
  • wwwexample.com- ডোমেন নাম যা শুরু হয় না www.তবে শুরু হয় www

শ্রেণিবদ্ধ ইউআরএলগুলির একটি জটিল ব্যাকরণ রয়েছে। আপনি যদি সাবধানে আরএফসি 3986 না পড়ে নিজের পার্সার রোল করার চেষ্টা করেন তবে আপনি সম্ভবত এটি ভুল হয়ে যাবেন। মূল লাইব্রেরিতে যেটি নির্মিত হয়েছে কেবল এটি ব্যবহার করুন।

আপনার যদি সত্যই java.net.URIপ্রত্যাখ্যান করে এমন অগোছালো ইনপুটগুলির সাথে ডিল করতে হয় , আরএফসি 3986 পরিশিষ্ট বি দেখুন:

নিয়মিত প্রকাশের সাথে একটি ইউআরআই রেফারেন্স পার্সিং করে পরিশিষ্ট বি

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

নীচের লাইনটি এর উপাদানগুলিতে সুগঠিত ইউআরআই রেফারেন্সটি ভাঙ্গার জন্য নিয়মিত অভিব্যক্তি।

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9

উপরের দ্বিতীয় লাইনে সংখ্যাগুলি কেবল পঠনযোগ্যতার জন্য সহায়তা করে; তারা প্রতিটি সুপ্রেসপ্রেসনের জন্য রেফারেন্স পয়েন্টগুলি নির্দেশ করে (অর্থাত্ প্রতিটি জোড় করা প্রথম বন্ধনী)।


2
@ জিতেন্দ্র, আমি আপনাকে এগুলি ঠিক করতে কাজ না করার পরামর্শ দিচ্ছি। জাভা গ্রন্থাগারগুলির লোকেরা ইতিমধ্যে আপনার জন্য কাজটি সম্পন্ন করেছে।
মাইক স্যামুয়েল

9
এছাড়াও ইউআরআই নেট ইউআরএল = নতুন ইউআরআই ("www.google.com"); নেটUll.getHost () NULL প্রদান করে। আমার মনে হয় এখনও আমার http: // বা https: //
র্যান্ডমকুইশন

2
@ জিতেন্দ্র, www.google.comএমন একটি পাথের উপাদানযুক্ত একটি সম্পর্কিত URL www.google.com। উদাহরণস্বরূপ, যদি এর বিরুদ্ধে সমাধান করা হয় তবে http://example.com/আপনি পাবেন http://example.com/www.google.com
মাইক স্যামুয়েল

ধন্যবাদ মাইক ,. আমি যদি সঠিকভাবে বুঝতে পারি, লাইব্রেরি সহ, আপনি বোঝাতে চেয়েছেন, হয় উপরের ইউআরআই বা রেজেক্স ব্যবহার করবেন?
র্যান্ডমউয়েশন

2
ইউআরআই হোস্টটি যদি এতে বিশেষ অক্ষর থাকে তবে তা বাতিল হয়ে যাবে, উদাহরণস্বরূপ: ".ob.se"
inc

80
import java.net.*;
import java.io.*;

public class ParseURL {
  public static void main(String[] args) throws Exception {

    URL aURL = new URL("http://example.com:80/docs/books/tutorial"
                       + "/index.html?name=networking#DOWNLOADING");

    System.out.println("protocol = " + aURL.getProtocol()); //http
    System.out.println("authority = " + aURL.getAuthority()); //example.com:80
    System.out.println("host = " + aURL.getHost()); //example.com
    System.out.println("port = " + aURL.getPort()); //80
    System.out.println("path = " + aURL.getPath()); //  /docs/books/tutorial/index.html
    System.out.println("query = " + aURL.getQuery()); //name=networking
    System.out.println("filename = " + aURL.getFile()); ///docs/books/tutorial/index.html?name=networking
    System.out.println("ref = " + aURL.getRef()); //DOWNLOADING
  }
}

আরও পড়ুন


15

InternetDomainName.topPrivateDomain()পেয়ারা ব্যবহার করে এখানে একটি ছোট এবং সাধারণ লাইন দেওয়া হল :InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()

দেওয়া হয়েছে http://www.google.com/blah, যে আপনাকে দিতে হবে google.com। বা, দেওয়া http://www.google.co.mx, এটি আপনাকে দেবে google.co.mx

সা কদা যেমন এই পোস্টে অন্য একটি উত্তরে মন্তব্য করেছেন , এই প্রশ্নটি আগে জিজ্ঞাসা করা হয়েছে: প্রদত্ত ইউআরএল থেকে প্রধান ডোমেন নামটি বের করুনসেরা উত্তর এই প্রশ্নের থেকে সত্য , যারা পেয়ারা এর প্রস্তাব দেওয়া (InternetDomainName.topPrivateDomain)

টপপ্রাইভেটডোমাইন () সর্বজনীন বুলিয়ান

এই ডোমেন নামটি হ'ল একটি সাবডোমেন উপাদান দ্বারা সর্বজনীন প্রত্যয় অনুসরণ করে কিনা তা সূচিত করে। উদাহরণস্বরূপ, google.com এবং foo.co.uk এর জন্য সত্য, তবে www.google.com বা co.uk এর জন্য নয় returns

সতর্কতা: এই পদ্ধতিটির সত্যিকারের ফলাফলটি বোঝায় না যে ডোমেনটি সর্বোচ্চ স্তরে যা একটি হোস্ট হিসাবে সম্বোধনযোগ্য, কারণ অনেকগুলি পাবলিক প্রত্যয়ও ঠিকঠাক হোস্ট। উদাহরণস্বরূপ, ডোমেন বার.uk.com এর ইউকে.কম এর সর্বজনীন প্রত্যয় রয়েছে, সুতরাং এটি এই পদ্ধতি থেকে সত্য হয়ে উঠবে। তবে ইউকে ডট কম নিজেই একটি ঠিকানাযোগ্য হোস্ট।

এই পদ্ধতিটি কোনও ডোমেন সম্ভবত সর্বোচ্চ স্তরের জন্য কুকি সেট করা হতে পারে তা নির্ধারণ করতে ব্যবহার করা যেতে পারে, যদিও এটি কুকি নিয়ন্ত্রণের পৃথক ব্রাউজারগুলির প্রয়োগের উপর নির্ভর করে। বিশদের জন্য আরএফসি 2109 দেখুন।

এটির সাথে একত্রে রাখলে URL.getHost(), যা মূল পোস্টটিতে ইতিমধ্যে রয়েছে, আপনাকে দেয়:

import com.google.common.net.InternetDomainName;

import java.net.URL;

public class DomainNameMain {

  public static void main(final String... args) throws Exception {
    final String urlString = "http://www.google.com/blah";
    final URL url = new URL(urlString);
    final String host = url.getHost();
    final InternetDomainName name = InternetDomainName.from(host).topPrivateDomain();
    System.out.println(urlString);
    System.out.println(host);
    System.out.println(name);
  }
}

6

আমি একটি পদ্ধতি লিখেছি (নীচে দেখুন) যা ইউআরএল এর ডোমেনের নাম আহরণ করে এবং এতে সরল স্ট্রিং ম্যাচিং ব্যবহার করা হয়। এটা কি আসলে আছে প্রথম মধ্যে বিট নিষ্কর্ষ হয় "://"(অথবা সূচক 0যদি কোন হচ্ছে "://"অন্তর্ভুক্ত) এবং প্রথম পরবর্তী "/"(অথবা সূচক String.length()আছে কিনা কোন পরবর্তী "/")। বাকি, পূর্ববর্তী "www(_)*."বিটটি কেটে ফেলা হয়েছে। আমি নিশ্চিত যে এমন কেস থাকবে যেখানে এটি যথেষ্ট ভাল হবে না তবে বেশিরভাগ ক্ষেত্রে এটি যথেষ্ট ভাল হওয়া উচিত!

উপরের মাইক স্যামুয়েল এর পোস্টে বলা হয়েছে যে java.net.URIক্লাসটি এটি করতে পারে (এবং এটি java.net.URLক্লাসের চেয়ে পছন্দসই ছিল ) তবে আমি URIক্লাসে সমস্যার সম্মুখীন হয়েছি । উল্লেখ্য, URI.getHost()যদি URL প্রকল্প, অর্থাত অন্তর্ভুক্ত নয় একটি নাল মান দেয় "http(s)"বিট।

/**
 * Extracts the domain name from {@code url}
 * by means of String manipulation
 * rather than using the {@link URI} or {@link URL} class.
 *
 * @param url is non-null.
 * @return the domain name within {@code url}.
 */
public String getUrlDomainName(String url) {
  String domainName = new String(url);

  int index = domainName.indexOf("://");

  if (index != -1) {
    // keep everything after the "://"
    domainName = domainName.substring(index + 3);
  }

  index = domainName.indexOf('/');

  if (index != -1) {
    // keep everything before the '/'
    domainName = domainName.substring(0, index);
  }

  // check for and remove a preceding 'www'
  // followed by any sequence of characters (non-greedy)
  // followed by a '.'
  // from the beginning of the string
  domainName = domainName.replaceFirst("^www.*?\\.", "");

  return domainName;
}

আমি মনে করি এটি সম্ভবত সঠিক না হতে পারেhttp://bob.com:8080/service/read?name=robert
লী মেটোর

লি নির্দেশ করার জন্য ধন্যবাদ। মনে রাখবেন যে "আমি নিশ্চিত যে এখানে এমন মামলা হবে যেখানে এটি যথেষ্ট ভাল হবে না ..." দিয়ে আমার উত্তরটি যোগ্য করে তুলেছি। আমার উত্তরটি আপনার বিশেষ ক্ষেত্রে সামান্য পরিবর্তন করতে হবে ifying
আদিল হুসেন

3

আমি ইউআরআই অবজেক্ট তৈরির পরে একটি ছোট চিকিত্সা করেছি

 if (url.startsWith("http:/")) {
        if (!url.contains("http://")) {
            url = url.replaceAll("http:/", "http://");
        }
    } else {
        url = "http://" + url;
    }
    URI uri = new URI(url);
    String domain = uri.getHost();
    return domain.startsWith("www.") ? domain.substring(4) : domain;

2

আমার ক্ষেত্রে আমার কেবল প্রধান ডোমেন প্রয়োজন এবং সাবডোমেন নয় (কোনও "www" বা সাবডোমেন যাই হোক না কেন):

public static String getUrlDomain(String url) throws URISyntaxException {
    URI uri = new URI(url);
    String domain = uri.getHost();
    String[] domainArray = domain.split("\\.");
    if (domainArray.length == 1) {
        return domainArray[0];
    }
    return domainArray[domainArray.length - 2] + "." + domainArray[domainArray.length - 1];
}

এই পদ্ধতির সাথে " https://rest.webtoapp.io/llSlider?lg=en&t=8 " ইউআরএল "ওয়েবটোপ.ইও" ডোমেনের জন্য থাকবে।


1

এটি ব্যবহার করে দেখুন: java.net.URL;
JOptionPane.showMessageDialog (নাল, getDomainName (নতুন ইউআরএল (" https://en.wikedia.org/wiki/List_of_Internet_top-level_domains "))));

public String getDomainName(URL url){
String strDomain;
String[] strhost = url.getHost().split(Pattern.quote("."));
String[] strTLD = {"com","org","net","int","edu","gov","mil","arpa"};

if(Arrays.asList(strTLD).indexOf(strhost[strhost.length-1])>=0)
    strDomain = strhost[strhost.length-2]+"."+strhost[strhost.length-1];
else if(strhost.length>2)
    strDomain = strhost[strhost.length-3]+"."+strhost[strhost.length-2]+"."+strhost[strhost.length-1];
else
    strDomain = strhost[strhost.length-2]+"."+strhost[strhost.length-1];
return strDomain;}

1

সেখানে একটি অনুরূপ প্রশ্ন হল একটি প্রদত্ত URL থেকে এক্সট্র্যাক্ট মূল ডোমেন নাম । আপনি যদি এই উত্তরটি একবার দেখে থাকেন তবে দেখতে পাবেন এটি খুব সহজ। আপনার কেবল ব্যবহার java.net.URLএবং Stringইউটিলিটি প্রয়োজন -Split


1
private static final String hostExtractorRegexString = "(?:https?://)?(?:www\\.)?(.+\\.)(com|au\\.uk|co\\.in|be|in|uk|org\\.in|org|net|edu|gov|mil)";
private static final Pattern hostExtractorRegexPattern = Pattern.compile(hostExtractorRegexString);

public static String getDomainName(String url){
    if (url == null) return null;
    url = url.trim();
    Matcher m = hostExtractorRegexPattern.matcher(url);
    if(m.find() && m.groupCount() == 2) {
        return m.group(1) + m.group(2);
    }
    return null;
}

ব্যাখ্যা: রেজেক্সের 4 টি গ্রুপ রয়েছে। প্রথম দুটি হ'ল মেলানো গ্রুপ এবং পরের দুটি হ'ল ম্যাচিং গ্রুপ।

প্রথম মিল না হওয়া গ্রুপটি হ'ল "HTTP" বা "https" বা ""

দ্বিতীয় মিল না হওয়া গ্রুপটি হ'ল "www।" বা ""

দ্বিতীয় ম্যাচিং গ্রুপটি শীর্ষ স্তরের ডোমেন

প্রথম ম্যাচিং গ্রুপটি নন-মেলানো গ্রুপগুলির পরে এবং শীর্ষ স্তরের ডোমেনের আগে যে কোনও কিছু

দুটি মিলিত গোষ্ঠীর সংক্ষেপণ আমাদের ডোমেন / হোস্টের নাম দেবে।

পিএস: দ্রষ্টব্য যে আপনি রেগেক্সে কয়েকটি সংখ্যক সমর্থিত ডোমেন যুক্ত করতে পারেন।


0

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

private String getHostName(String urlInput) {
        urlInput = urlInput.toLowerCase();
        String hostName=urlInput;
        if(!urlInput.equals("")){
            if(urlInput.startsWith("http") || urlInput.startsWith("https")){
                try{
                    URL netUrl = new URL(urlInput);
                    String host= netUrl.getHost();
                    if(host.startsWith("www")){
                        hostName = host.substring("www".length()+1);
                    }else{
                        hostName=host;
                    }
                }catch (MalformedURLException e){
                    hostName=urlInput;
                }
            }else if(urlInput.startsWith("www")){
                hostName=urlInput.substring("www".length()+1);
            }
            return  hostName;
        }else{
            return  "";
        }
    }

0

উপরের সমস্ত ভাল। এটি আমার কাছে সত্যই সহজ এবং বোধগম্য বলে মনে হচ্ছে। উক্তিটি ক্ষমা করুন। আমি এটি গ্রোভির জন্য ডেটা সেন্টার নামে একটি শ্রেণীর ভিতরে লিখেছিলাম।

static String extractDomainName(String url) {
    int start = url.indexOf('://')
    if (start < 0) {
        start = 0
    } else {
        start += 3
    }
    int end = url.indexOf('/', start)
    if (end < 0) {
        end = url.length()
    }
    String domainName = url.substring(start, end)

    int port = domainName.indexOf(':')
    if (port >= 0) {
        domainName = domainName.substring(0, port)
    }
    domainName
}

এবং এখানে কিছু জুনিট 4 পরীক্ষা রয়েছে:

@Test
void shouldFindDomainName() {
    assert DataCenter.extractDomainName('http://example.com/path/') == 'example.com'
    assert DataCenter.extractDomainName('http://subpart.example.com/path/') == 'subpart.example.com'
    assert DataCenter.extractDomainName('http://example.com') == 'example.com'
    assert DataCenter.extractDomainName('http://example.com:18445/path/') == 'example.com'
    assert DataCenter.extractDomainName('example.com/path/') == 'example.com'
    assert DataCenter.extractDomainName('example.com') == 'example.com'
}

0

সমস্ত ক্ষেত্রে আমি যেভাবে কাজ করেছি এবং কাজ করেছি তার মধ্যে একটি হল পেয়ারা লাইব্রেরি এবং রেগেক্সের সংমিশ্রণে ব্যবহার করা।

public static String getDomainNameWithGuava(String url) throws MalformedURLException, 
  URISyntaxException {
    String host =new URL(url).getHost();
    String domainName="";
    try{
        domainName = InternetDomainName.from(host).topPrivateDomain().toString();
    }catch (IllegalStateException | IllegalArgumentException e){
        domainName= getDomain(url,true);
    }
    return domainName;
}

গেটডোমাইন () হ'ল রেগেক্স সহ যে কোনও সাধারণ পদ্ধতি হতে পারে।


0

সাবডোমেন ছাড়াই প্রকৃত ডোমেন নাম পেতে, আমি ব্যবহার করি:

private String getDomainName(String url) throws URISyntaxException {
    String hostName = new URI(url).getHost();
    if (!hostName.contains(".")) {
        return hostName;
    }
    String[] host = hostName.split("\\.");
    return host[host.length - 2];
}

নোট করুন যে এটি দ্বিতীয় স্তরের ডোমেনগুলির সাথে কাজ করবে না (যেমন .co.uk)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.