URL से पार्सिंग डोमेन


144

मुझे एक फ़ंक्शन बनाने की ज़रूरत है जो URL से डोमेन को पार्स करता है।

के साथ

http://google.com/dhasjkdas/sadsdds/sdda/sdads.html

या

http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html

यह वापस आ जाना चाहिए google.com

साथ में

http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html

यह वापस आ जाना चाहिए google.co.uk



9
@LightnessRacesinOrbit यह "मैनुअल में देखने" की तुलना में थोड़ा अधिक है। PHP के parse_url()रिटर्न मेजबान , नहीं डोमेन
MrWhite

1
@ w3dk: यह अभी भी एक शानदार शुरुआती बिंदु होगा, जिससे यह सवाल parse_urlअस्पष्ट "मैं क्या कर सकता हूं" के बजाय उस सीमा के बारे में हो सकता है ।
ऑर्बिट

5
@LightnessRacesinOrbit आपकी रक्षा को आपकी प्रतिष्ठा को देखते हुए अपमानजनक है - और अधिक सरलता से आप स्वीकार कर सकते हैं कि आपने प्रश्न को पूरी तरह से नहीं पढ़ा है
एंडी जोन्स

4
@LightnessRacesinOrbit जरूरी नहीं है। support.suso.com/supki/…
लियोनार्ड

जवाबों:


297

देखें parse_url():

$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
echo $parse['host']; // prints 'google.com'

parse_url वास्तव में बुरी तरह से उकसाए गए हैंडल को बहुत अच्छी तरह से संभाल नहीं करता है, लेकिन अगर आप आम तौर पर सभ्य यूआरएल की उम्मीद करते हैं तो ठीक है।


35
एक चीज parse_url () नहीं करता है केवल डोमेन वापस कर देता है। यदि आप www.google.com या www.google.co.uk जोड़ते हैं, तो यह मेजबान को भी लौटा देगा। उसके लिए कोई सुझाव?
गेविन एम। रॉय


6
parse_urlउपडोमेन को संभाल नहीं है, लेकिन Purl करता है: github.com/jwage/purl
डेमियन

1
parse_url()संभवतः एक ऐसे डोमेन के साथ URL को पार्स करेगा जिसमें गलत तरीके से डैश हैं। निश्चित प्रमाण नहीं मिला, लेकिन इस बग को देखें । आंतरिक रूप से FILTER_VALIDATE_URLउपयोग करता है parse_url()
XedinUnogn

8
या बस: print parse_url($url, PHP_URL_HOST))अगर आपको $parseकिसी और चीज़ के लिए सरणी की आवश्यकता नहीं है।
rybo111

98
$domain = str_ireplace('www.', '', parse_url($url, PHP_URL_HOST));

यह http://google.com/ ... और http://www.google.com/ ... google.comदोनों के लिए लौटाएगा


18
यदि आप "server.google.com" या "www3.google.com" में डालते हैं, तो भी यह सर्वर को लौटा देगा ...
patrick

सभी उप-डोमेन www नहीं हैं, क्रॉल-66-249-66-1.googlebot.com, myblog.blogspot.com कुछ उदाहरण हैं।
राफार्क

23

से http://us3.php.net/manual/en/function.parse-url.php#93983

किसी विषम कारण के लिए, parse_url मेजबान को (उदा। example.com) पथ के रूप में देता है जब इनपुट url में कोई योजना प्रदान नहीं की जाती है। इसलिए मैंने असली मेजबान पाने के लिए एक त्वरित कार्य लिखा है:

function getHost($Address) { 
   $parseUrl = parse_url(trim($Address)); 
   return trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2))); 
} 

getHost("example.com"); // Gives example.com 
getHost("http://example.com"); // Gives example.com 
getHost("www.example.com"); // Gives www.example.com 
getHost("http://example.com/xyz"); // Gives example.com 

जैसे अपने तार उद्धृत करने के लिए मत भूलना hostऔर path
ग़ुम्बो

1
यदि मैं example.com का उपयोग करता हूं, तो php एक सूचना प्रदर्शित करता है: Message: Undefined index: hostइसे ठीक करने के लिए कोई विचार?
Zim3r

1
दुर्भाग्य से उपडोमेन अभी भी इस दृष्टिकोण के साथ शामिल है, अपने उदाहरण # 3 देखें।
जेनमैप्टन

1
@ Zim3r टर्नरी के पहले भाग को बदलें !empty($parseUrl['host'])
Demonslay335

LOL अगर इसकी कोई योजना नहीं है, तो यह एक URL नहीं है।
miken32

12

कोड जो 100% काम करने के लिए था, वह मेरे लिए कटौती नहीं करता था, मैंने उदाहरण को थोड़ा सा पैच किया, लेकिन पाया गया कोड जो इसमें मदद नहीं कर रहा था और इसके साथ समस्या थी। इसलिए मैंने इसे कुछ कार्यों में बदल दिया (हर समय मोज़िला से सूची के लिए पूछने के लिए और कैश सिस्टम को हटाने के लिए)। यह 1000 यूआरएल के सेट के खिलाफ परीक्षण किया गया है और काम करने के लिए लग रहा है।

function domain($url)
{
    global $subtlds;
    $slds = "";
    $url = strtolower($url);

    $host = parse_url('http://'.$url,PHP_URL_HOST);

    preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
    foreach($subtlds as $sub){
        if (preg_match('/\.'.preg_quote($sub).'$/', $host, $xyz)){
            preg_match("/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $matches);
        }
    }

    return @$matches[0];
}

function get_tlds() {
    $address = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
    $content = file($address);
    foreach ($content as $num => $line) {
        $line = trim($line);
        if($line == '') continue;
        if(@substr($line[0], 0, 2) == '/') continue;
        $line = @preg_replace("/[^a-zA-Z0-9\.]/", '', $line);
        if($line == '') continue;  //$line = '.'.$line;
        if(@$line[0] == '.') $line = substr($line, 1);
        if(!strstr($line, '.')) continue;
        $subtlds[] = $line;
        //echo "{$num}: '{$line}'"; echo "<br>";
    }

    $subtlds = array_merge(array(
            'co.uk', 'me.uk', 'net.uk', 'org.uk', 'sch.uk', 'ac.uk', 
            'gov.uk', 'nhs.uk', 'police.uk', 'mod.uk', 'asn.au', 'com.au',
            'net.au', 'id.au', 'org.au', 'edu.au', 'gov.au', 'csiro.au'
        ), $subtlds);

    $subtlds = array_unique($subtlds);

    return $subtlds;    
}

फिर इसका उपयोग करें

$subtlds = get_tlds();
echo domain('www.example.com') //outputs: example.com
echo domain('www.example.uk.com') //outputs: example.uk.com
echo domain('www.example.fr') //outputs: example.fr

मुझे पता है कि मुझे इसे कक्षा में बदल देना चाहिए था, लेकिन समय नहीं था।


11
function get_domain($url = SITE_URL)
{
    preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,6}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
    return $_domain_tld[0];
}

get_domain('http://www.cdl.gr'); //cdl.gr
get_domain('http://cdl.gr'); //cdl.gr
get_domain('http://www2.cdl.gr'); //cdl.gr

मेरे लिए कोई काम नहीं कर रहा है: example.com // ग़लत: खाली स्ट्रिंग example.com // Correct: example.com www.example.com // ग़लत: खाली स्ट्रिंग उदाहरण.
com

यह एक शानदार उत्तर है और अधिक श्रेय का हकदार है। इस लाइन को फंक्शन में पहली लाइन के रूप में जोड़ें और यह मंगेशशेठ और जेनलम्पटन की समस्याओं को भी हल करता है: अगर (($ $ url, 0, strlen ('http: //')) <> 'http:' ) && (पदार्थ ($ url, 0, strlen ('https: //')) <> 'https: //')) $ url = 'http: //'.$url;
रिक

4

यदि आप स्ट्रिंग से होस्ट निकालना चाहते हैं http://google.com/dhasjkdas/sadsdds/sdda/sdads.html, तो parse_url () का उपयोग आपके लिए स्वीकार्य समाधान है।

लेकिन अगर आप एक्सट्रैक्ट डोमेन या उसके हिस्से चाहते हैं, तो आपको सार्वजनिक प्रत्यय सूची का उपयोग करने वाले पैकेज की आवश्यकता है । हां, आप स्ट्रिंग फंक्शंस arround parse_url () का उपयोग कर सकते हैं, लेकिन यह कभी-कभी गलत परिणाम देगा।

मैं डोमेन पार्सिंग के लिए TLDExtract का पुन: अध्ययन करता हूं , यहां नमूना कोड है जो अलग-अलग दिखाता है:

$extract = new LayerShifter\TLDExtract\Extract();

# For 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'

$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';

parse_url($url, PHP_URL_HOST); // will return google.com

$result = $extract->parse($url);
$result->getFullHost(); // will return 'google.com'
$result->getRegistrableDomain(); // will return 'google.com'
$result->getSuffix(); // will return 'com'

# For 'http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html'

$url = 'http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html';

parse_url($url, PHP_URL_HOST); // will return 'search.google.com'

$result = $extract->parse($url);
$result->getFullHost(); // will return 'search.google.com'
$result->getRegistrableDomain(); // will return 'google.com'

इस सुझाव के लिए बहुत बहुत धन्यवाद। मुझे लगता है कि एक सरल कार्य प्रतीत होता है के लिए एक और पुस्तकालय जोड़ने से नफरत है , लेकिन फिर मैंने देखा कि उनके द्वारा तैयार की गई इस उद्धरण को मेरे लिए लागू किया गया है: "हर कोई इस गलत हो जाता है। 'पर विभाजित।' और पिछले 2 तत्वों लेने केवल एक लंबा रास्ता चला जाता है अगर आप सरल जैसे .com डोमेन सोचो पार्स की सोच रहे हैं। forums.bbc.co.uk उदाहरण के लिए: अनुभवहीन बंटवारे विधि ऊपर आप डोमेन के रूप में 'सह' दे देंगे और 'uk' को क्रमशः 'bbc' और 'co.uk' के बजाय TLD के रूप में। "
५35 पर डेमोनसेले ३३५

डॉट्स को विभाजित करने के लिए परिणाम, जबकि हम अपने प्यारे .co.uk डोमेन पर क्या होना चाहते हैं, वास्तव में सही परिणाम है, सह ब्रिटेन का दूसरा स्तर होने के साथ शीर्ष स्तर है। वेबमास्टर को अक्सर इसका एहसास नहीं होता है।
क्रिस

4

मैंने पाया है कि @ फिल्फेरो का समाधान (php.net से संदर्भित) ठीक परिणाम प्राप्त करने के लिए बहुत अच्छी तरह से है, लेकिन कुछ मामलों में यह php के "नोटिस" और "सख्त मानकों" संदेश को दर्शाता है। यहाँ इस कोड का एक निश्चित संस्करण है।

function getHost($url) { 
   $parseUrl = parse_url(trim($url)); 
   if(isset($parseUrl['host']))
   {
       $host = $parseUrl['host'];
   }
   else
   {
        $path = explode('/', $parseUrl['path']);
        $host = $path[0];
   }
   return trim($host); 
} 

echo getHost("http://example.com/anything.html");           // example.com
echo getHost("http://www.example.net/directory/post.php");  // www.example.net
echo getHost("https://example.co.uk");                      // example.co.uk
echo getHost("www.example.net");                            // example.net
echo getHost("subdomain.example.net/anything");             // subdomain.example.net
echo getHost("example.net");                                // example.net

2

यहाँ कोड है जो मैंने बनाया है कि 100% केवल डोमेन नाम ढूंढता है, क्योंकि यह खाते में मोज़िला उप संधि लेता है। केवल आपको चेक करना है कि आप उस फ़ाइल का कैश कैसे बनाते हैं, इसलिए आप हर बार मोज़िला को क्वेरी नहीं करते हैं।

कुछ अजीब कारणों से, co.uk जैसे डोमेन सूची में नहीं हैं, इसलिए आपको कुछ हैकिंग करनी होगी और उन्हें मैन्युअल रूप से जोड़ना होगा। इसका सबसे अच्छा समाधान नहीं है, लेकिन मुझे आशा है कि यह किसी की मदद करता है।

//=====================================================
static function domain($url)
{
    $slds = "";
    $url = strtolower($url);

            $address = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
    if(!$subtlds = @kohana::cache('subtlds', null, 60)) 
    {
        $content = file($address);
        foreach($content as $num => $line)
        {
            $line = trim($line);
            if($line == '') continue;
            if(@substr($line[0], 0, 2) == '/') continue;
            $line = @preg_replace("/[^a-zA-Z0-9\.]/", '', $line);
            if($line == '') continue;  //$line = '.'.$line;
            if(@$line[0] == '.') $line = substr($line, 1);
            if(!strstr($line, '.')) continue;
            $subtlds[] = $line;
            //echo "{$num}: '{$line}'"; echo "<br>";
        }
        $subtlds = array_merge(Array(
            'co.uk', 'me.uk', 'net.uk', 'org.uk', 'sch.uk', 'ac.uk', 
            'gov.uk', 'nhs.uk', 'police.uk', 'mod.uk', 'asn.au', 'com.au',
            'net.au', 'id.au', 'org.au', 'edu.au', 'gov.au', 'csiro.au',
            ),$subtlds);

        $subtlds = array_unique($subtlds);
        //echo var_dump($subtlds);
        @kohana::cache('subtlds', $subtlds);
    }


    preg_match('/^(http:[\/]{2,})?([^\/]+)/i', $url, $matches);
    //preg_match("/^(http:\/\/|https:\/\/|)[a-zA-Z-]([^\/]+)/i", $url, $matches);
    $host = @$matches[2];
    //echo var_dump($matches);

    preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
    foreach($subtlds as $sub) 
    {
        if (preg_match("/{$sub}$/", $host, $xyz))
        preg_match("/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $matches);
    }

    return @$matches[0];
}

डोमेन co.ukसूची में नहीं था, इसका कारण यह था कि यह TLD की सूची थी, डोमेन की नहीं। इस उत्तर के लिखे जाने के बाद से ccTLD बहुत बदल गया है। विशेष रूप से: "नए पंजीकरण सीधे .uk को Nominet द्वारा 10 जून 2014 से 08:00 बजे तक स्वीकार कर लिया गया है, हालांकि मौजूदा ग्राहकों के लिए एक आरक्षण अवधि है जो पहले से ही .co.uk, .org.uk, .me.uk हैं। .net.uk, .ltd.uk या .plc.uk डोमेन को संबंधित .uk डोमेन का दावा करने के लिए, जो 10 जून 2019 को 07:59 BST तक चलता है । " ( स्रोत )
ashleedawg

2

आप दूसरे पैरामीटर के रूप में parse_url फ़ंक्शन में PHP_URL_HOST पास कर सकते हैं

$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$host = parse_url($url, PHP_URL_HOST);
print $host; // prints 'google.com'

2
यह अनिवार्य रूप से ऊपर दिए गए उत्तर के समान है, हालांकि, प्रश्न को डोमेन की आवश्यकता होती है , जो आवश्यक रूप से मेजबान के समान नहीं है ।
मृद्वीथ

योजना के बारे में ऊपर टिप्पणी देखें: किसी विषम कारण के लिए, parse_url मेजबान को (उदा। example.com) पथ के रूप में देता है जब कोई योजना इनपुट url में प्रदान नहीं की जाती है। इसलिए मैंने असली मेजबान पाने के लिए एक त्वरित कार्य लिखा है:
jenlampton


2

कृपया निम्नलिखित के साथ स्वीकृत समाधान की प्रतिकृति पर विचार करें:

parse_url () में हमेशा किसी भी उप-डोमेन (ओं) को शामिल किया जाएगा, इसलिए यह फ़ंक्शन डोमेन नामों को बहुत अच्छी तरह से पार्स नहीं करता है। यहाँ कुछ उदाहरण हैं:

$url = 'http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
echo $parse['host']; // prints 'www.google.com'

echo parse_url('https://subdomain.example.com/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.com

echo parse_url('https://subdomain.example.co.uk/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.co.uk

इसके बजाय, आप इस व्यावहारिक समाधान पर विचार कर सकते हैं। यह कई को कवर करेगा, लेकिन सभी डोमेन नामों को नहीं - उदाहरण के लिए, 'sos.state.oh.us' जैसे निचले स्तर के डोमेन को कवर नहीं किया गया है।

function getDomain($url) {
    $host = parse_url($url, PHP_URL_HOST);

    if(filter_var($host,FILTER_VALIDATE_IP)) {
        // IP address returned as domain
        return $host; //* or replace with null if you don't want an IP back
    }

    $domain_array = explode(".", str_replace('www.', '', $host));
    $count = count($domain_array);
    if( $count>=3 && strlen($domain_array[$count-2])==2 ) {
        // SLD (example.co.uk)
        return implode('.', array_splice($domain_array, $count-3,3));
    } else if( $count>=2 ) {
        // TLD (example.com)
        return implode('.', array_splice($domain_array, $count-2,2));
    }
}

// Your domains
    echo getDomain('http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
    echo getDomain('http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
    echo getDomain('http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html'); // google.co.uk

// TLD
    echo getDomain('https://shop.example.com'); // example.com
    echo getDomain('https://foo.bar.example.com'); // example.com
    echo getDomain('https://www.example.com'); // example.com
    echo getDomain('https://example.com'); // example.com

// SLD
    echo getDomain('https://more.news.bbc.co.uk'); // bbc.co.uk
    echo getDomain('https://www.bbc.co.uk'); // bbc.co.uk
    echo getDomain('https://bbc.co.uk'); // bbc.co.uk

// IP
    echo getDomain('https://1.2.3.45');  // 1.2.3.45

अंत में, जेरेमी केंडल का PHP डोमेन पार्सर आपको एक यूआरएल से डोमेन नाम पार्स करने की अनुमति देता है। लीग यूआरआई होस्टनाम पार्सर भी काम करेगा।


नमस्ते, यह अच्छा है, लेकिन यह आईपी पते के साथ काम नहीं करता है। फिर भी, महान काम।
मेके

1

parse_url ने मेरे लिए काम नहीं किया। इसने केवल रास्ता लौटाया। Php5.3 + का उपयोग करके मूल बातें पर स्विच करना:

$url  = str_replace('http://', '', strtolower( $s->website));
if (strpos($url, '/'))  $url = strstr($url, '/', true);

1

मैंने आपके लिए संपादित किया है:

function getHost($Address) { 
    $parseUrl = parse_url(trim($Address));
    $host = trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2))); 

    $parts = explode( '.', $host );
    $num_parts = count($parts);

    if ($parts[0] == "www") {
        for ($i=1; $i < $num_parts; $i++) { 
            $h .= $parts[$i] . '.';
        }
    }else {
        for ($i=0; $i < $num_parts; $i++) { 
            $h .= $parts[$i] . '.';
        }
    }
    return substr($h,0,-1);
}

सभी प्रकार url (www.domain.ltd, sub1.subn.domain.ltd: domain.ltd के परिणामस्वरूप होगा।


1

मैं इस उत्तर को देर से जोड़ रहा हूं क्योंकि यह उत्तर है जो Google पर सबसे अधिक पॉप अप करता है ...

आप PHP का उपयोग कर सकते हैं ...

$url = "www.google.co.uk";
$host = parse_url($url, PHP_URL_HOST);
// $host == "www.google.co.uk"

होस्ट को हथियाने के लिए लेकिन निजी डोमेन को नहीं जिसमें मेजबान को संदर्भित करता है। (उदाहरण www.google.co.ukमेजबान है, लेकिन google.co.ukनिजी डोमेन है)

निजी डोमेन को हथियाने के लिए, आपको सार्वजनिक प्रत्ययों की सूची पता होनी चाहिए, जिससे कोई निजी डोमेन पंजीकृत कर सके । यह सूची मोज़िला द्वारा https://publicsuffix.org/ पर क्यूरेट की जाती है

नीचे दिया गया कोड तब काम करता है जब सार्वजनिक प्रत्ययों की एक सरणी पहले ही बनाई जा चुकी होती है। बस बुलाओ

$domain = get_private_domain("www.google.co.uk");

शेष कोड के साथ ...

// find some way to parse the above list of public suffix
// then add them to a PHP array
$suffix = [... all valid public suffix ...];

function get_public_suffix($host) {
  $parts = split("\.", $host);
  while (count($parts) > 0) {
    if (is_public_suffix(join(".", $parts)))
      return join(".", $parts);

    array_shift($parts);
  }

  return false;
}

function is_public_suffix($host) {
  global $suffix;
  return isset($suffix[$host]);
}

function get_private_domain($host) {
  $public = get_public_suffix($host);
  $public_parts = split("\.", $public);
  $all_parts = split("\.", $host);

  $private = [];

  for ($x = 0; $x < count($public_parts); ++$x) 
    $private[] = array_pop($all_parts);

  if (count($all_parts) > 0)
    $private[] = array_pop($all_parts);

  return join(".", array_reverse($private));
}

मेरे परीक्षण के अनुसार, parse_url को एक अच्छी तरह से बने URL की आवश्यकता है। यदि आप सिर्फ 'www.someDomain.com/path' देते हैं तो यह अशक्त हो जाएगा। इसलिए यह एक प्रोटोकॉल (जैसे http या https) मौजूद होने की उम्मीद करता है।
एंडी

0

यह आम तौर पर बहुत अच्छा काम करेगा अगर इनपुट URL कुल रद्दी नहीं है। यह उपडोमेन को हटाता है।

$host = parse_url( $Row->url, PHP_URL_HOST );
$parts = explode( '.', $host );
$parts = array_reverse( $parts );
$domain = $parts[1].'.'.$parts[0];

उदाहरण

इनपुट: http://www2.website.com:8080/some/file/structure?some=parameters

आउटपुट: website.com


0

Worldofjr और Alix Axel के उत्तरों को एक छोटे से फ़ंक्शन में संयोजित करना, जो अधिकांश उपयोग के मामलों को संभालेंगे:

function get_url_hostname($url) {

    $parse = parse_url($url);
    return str_ireplace('www.', '', $parse['host']);

}

get_url_hostname('http://www.google.com/example/path/file.html'); // google.com

यह सीमित समाधान है
MGE

0
function getTrimmedUrl($link)
{
    $str = str_replace(["www.","https://","http://"],[''],$link);
    $link = explode("/",$str);
    return strtolower($link[0]);                
}


-6

बस निम्नलिखित के रूप में उपयोग करें ...

<?php
   echo $_SERVER['SERVER_NAME'];
?>

1
यह मान रहा है कि सर्वर वह यूआरएल है जिसे आप डोमेन से प्राप्त करना चाहते हैं। ऐसी बात नहीं है।
ओवरकोड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.