2010-07-09 8 views
13

मैं एक URL से डोमेन नाम पाने के लिए की जरूरत है। निम्न उदाहरण सभी लौटना चाहिए google.com:कैसे एक यूआरएल PHP का उपयोग करने से आधार डोमेन नाम पाने के लिए?

google.com 
images.google.com 
new.images.google.com 
www.google.com 

इसी तरह निम्न URL सभी लौटना चाहिए google.co.uk

google.co.uk 
images.google.co.uk 
new.images.google.co.uk 
http://www.google.co.uk 

मैं रेगुलर एक्सप्रेशन का उपयोग करने में संकोच कर रहा हूँ, क्योंकि domain.com/google.com की तरह कुछ गलत परिणाम लौट सकते हैं।

मैं शीर्ष स्तर के डोमेन कैसे प्राप्त कर सकते हैं, PHP का उपयोग? इसे सभी प्लेटफार्मों और मेजबानों पर काम करने की जरूरत है।

+1

यह मुश्किल है की तरह स्ट्रिंग में परिणाम मिलेगा। 'Google.com' के लिए, आप टीएलडी और दूसरे स्तर के डोमेन नाम में रूचि रखते हैं। 'Google.co.uk' के लिए, आप टीएलडी और दूसरे और तीसरे स्तर के डोमेन नाम चाहते हैं। कोई परिभाषित "आधार नाम" नहीं है, जिसका अर्थ है "आधार नाम" से अलग-अलग रजिस्ट्रार/टीएलडी के लिए अलग है। – deceze

+1

मुझे पूरा यकीन है कि आपको थोड़ा लंबा हवाला देना होगा, जो आप पूछ रहे हैं वह आपके केक खा रहा है और इसे भी ले रहा है। टीएलडी की सूची के बिना co.uk और google.com के बीच अंतर करने का कोई तरीका नहीं है, वे मेजबान नाम दोनों हैं। –

+0

मुझे लगता है कि आप सही हैं, ऐसा लगता है कि कुछ भी कोड के बिना काम नहीं करेगा – Rohan

उत्तर

16

आप ऐसा कर सकता है:

$urlData = parse_url($url); 

$host = $urlData['host']; 

** अद्यतन **

सबसे अच्छा तरीका है मैं के बारे में सोच सकते हैं सभी TLD के की मैपिंग है कि आप इसे संभालना चाहते हैं, क्योंकि कुछ टीएलडी मुश्किल हो सकते हैं (co.uk)।

// you can add more to it if you want 
$urlMap = array('com', 'co.uk'); 

$host = ""; 
$url = "http://www.google.co.uk"; 

$urlData = parse_url($url); 
$hostData = explode('.', $urlData['host']); 
$hostData = array_reverse($hostData); 

if(array_search($hostData[1] . '.' . $hostData[0], $urlMap) !== FALSE) { 
    $host = $hostData[2] . '.' . $hostData[1] . '.' . $hostData[0]; 
} elseif(array_search($hostData[0], $urlMap) !== FALSE) { 
    $host = $hostData[1] . '.' . $hostData[0]; 
} 

echo $host; 
3

उपयोग करके देखें: http://php.net/manual/en/function.parse-url.php। कुछ इस तरह काम करना चाहिए:

$urlParts = parse_url($yourUrl); 
$hostParts = explode('.', $urlParts['host']); 
$hostParts = array_reverse($hostParts); 
$host = $hostParts[1] . '.' . $hostParts[0]; 
+1

यदि आपके पास ऐसा कुछ है तो यह टूट जाएगा: http: //www.google.co.uk - उस मामले में, यह "co.uk" वापस आ जाएगा। – xil3

+1

वास्तव में, इसे हल करने का एकमात्र तरीका टीएलडी सूची का उपयोग कर रहा है। –

-3

उपयोग इस समारोह:

function getHost($url){ 
    if (strpos($url,"http://")){ 
     $httpurl=$url; 
    } else { 
     $httpurl="http://".$url; 
    } 
    $parse = parse_url($httpurl); 
    $domain=$parse['host']; 

    $portion=explode(".",$domain); 
    $count=sizeof($portion)-1; 
    if ($count>1){ 
     $result=$portion[$count-1].".".$portion[$count]; 
    } else { 
     $result=$domain; 
    } 
    return $result; 
} 

उत्तर उदाहरण यूआरएल के सभी वेरिएंट।

5

उच्च-स्तरीय डोमेन और द्वितीय-स्तरीय डोमेन 2 वर्णों का हो सकता है, लेकिन एक पंजीकृत उप डोमेन कम से कम 3 अक्षरों का होना चाहिए।

संपादित करें: पीजेवी की टिप्पणी के कारण, मैंने सीखा है कि ऑस्ट्रेलियाई डोमेन नाम अपवाद हैं क्योंकि वे 5 टीएलडी को एसएलडी (कॉम, नेट, ऑर्ग, एएसएन, आईडी) उदाहरण के रूप में अनुमति देते हैं: somedomain.com.au। मुझे लगता है कि com.au राष्ट्रीय स्तर पर नियंत्रित डोमेन नाम है जो "शेयर" है। इसलिए, तकनीकी रूप से, "com.au" अभी भी "बेस डोमेन" होगा, लेकिन यह उपयोगी नहीं है।

संपादित करें: 47,952 संभव तीन-अक्षर डोमेन नाम हैं (पैटर्न: [ए-जेए-जेड 0-9] [ए-जेए-जेड 0 9 -9]] [ए-जेए-जेड 0 9/9] या 36 * 37 * 36) सिर्फ 8 सबसे आम TLD के के साथ संयुक्त (कॉम, org, आदि) हम 383,616 संभावना है - यहां तक ​​कि TLD के के संपूर्ण दायरे में जोड़े बिना। 1-अक्षर और 2-अक्षर डोमेन नाम अभी भी मौजूद हैं, लेकिन आगे जाने योग्य मान्य नहीं हैं।

google.com में

- "गूगल" "com" का उप डोमेन है

google.co.uk में

- "गूगल" "सह", का उप जो बारी में का उप डोमेन है है "यूके", या दूसरा स्तर का डोमेन वास्तव में, चूंकि "सह" एक वैध शीर्ष-स्तरीय डोमेन भी है

www.google.com में - "www" "google" का सबडोमेन है जो सबडोमेन है "com" की

"co.uk" एक मान्य मेजबान क्योंकि ऐसा कोई मान्य डोमेन नाम

कि assumpt के साथ जा रहा है आयन यह कार्य "यूआरएल मानचित्र" की आवश्यकता के बिना, लगभग सभी मामलों में उचित "आधारित" वापस कर देगा।

यदि आप दुर्लभ मामलों में से एक होते हैं, तो शायद आप इसे विशेष आवश्यकताओं को पूरा करने के लिए संशोधित कर सकते हैं ...

संपादित करें: आपको डोमेन स्ट्रिंग को इसके प्रोटोकॉल (http: //, ftp: //, आदि) के साथ यूआरएल के रूप में पास करना होगा या parse_url() इसे वैध यूआरएल नहीं मानेंगे (जब तक कि आप व्यवहार करने के लिए कोड को संशोधित नहीं करना चाहते अलग ढंग से)

function basedomain($str = '') 
{ 
    // $str must be passed WITH protocol. ex: http://domain.com 
    $url = @parse_url($str); 
    if (empty($url['host'])) return; 
    $parts = explode('.', $url['host']); 
    $slice = (strlen(reset(array_slice($parts, -2, 1))) == 2) && (count($parts) > 2) ? 3 : 2; 
    return implode('.', array_slice($parts, (0 - $slice), $slice)); 
} 

अगर आप सही उपयोग fopen या curl इस URL खोलने के लिए होने की जरूरत: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

तो एक सरणी में लाइनों को पढ़ने और उपयोग करने वाले डोमेन भागों की तुलना करने के

,210

संपादित करें: ऑस्ट्रेलियाई डोमेन के लिए अनुमति देने के लिए:

function au_basedomain($str = '') 
{ 
    // $str must be passed WITH protocol. ex: http://domain.com 
    $url = @parse_url($str); 
    if (empty($url['host'])) return; 
    $parts = explode('.', $url['host']); 
    $slice = (strlen(reset(array_slice($parts, -2, 1))) == 2) && (count($parts) > 2) ? 3 : 2; 
    if (preg_match('/\.(com|net|asn|org|id)\.au$/i', $url['host'])) $slice = 3; 
    return implode('.', array_slice($parts, (0 - $slice), $slice)); 
} 

महत्वपूर्ण अतिरिक्त नोट्स: मैं डोमेन मान्य करने के लिए इस सुविधा का उपयोग नहीं करते। यह सामान्य कोड है जो मैं केवल विभिन्न आंतरिक स्क्रिप्ट के भीतर उपयोग के लिए वैश्विक $_SERVER['SERVER_NAME'] से चल रहे सर्वर के लिए बेस डोमेन निकालने के लिए उपयोग करता हूं। ध्यान में रखते हुए मैंने कभी अमेरिका के भीतर साइटों पर काम किया है, मैंने कभी ऑस्ट्रेलियाई रूपों का सामना नहीं किया है जो पीजेवी ने पूछा था। यह आंतरिक उपयोग के लिए आसान है, लेकिन यह एक पूर्ण डोमेन सत्यापन प्रक्रिया से एक लंबा रास्ता है। यदि आप इसे इस तरह से उपयोग करने का प्रयास कर रहे हैं, तो मैं अमान्य डोमेन से मेल खाने के लिए बहुत अधिक संभावनाओं के कारण नहीं अनुशंसा करता हूं।

+1

यदि आप उस 'strlen() == 2' से '<= 3' को बदलते हैं तो आप 99% डोमेन प्राप्त करेंगे, स्थानीयहोस्ट पर सबडोमेन को सहेज लेंगे और क्या नहीं। यहां मेरा संशोधन किया गया है: https://gist.github.com/anonymous/fe77c97e632675411c3c – Mahn

+0

नहीं, संशोधन सही तरीके से काम नहीं करता है। यह == 2 होना चाहिए क्योंकि <= 3 मेल खाएगा जब अंतिम भाग के बगल में 3 होगा - जिसे हम नहीं करना चाहते हैं। हम इसे "www.google.com" या "mail.google.com" से "google.com" वापस करना चाहते हैं, और हम इसे "www.google.co.uk" से "google.co.uk" वापस करना चाहते हैं। या "mail.google.co.uk" – aequalsb

+0

@Mahn इसके अतिरिक्त, आपके संशोधन में कई अतिरिक्त बिट्स हैं - अनइडेड वैरिएबल असाइनमेंट और अनइडेड हालत घोंसला। अधिक कोड और अवांछित परिणाम - क्या आपने अपना संशोधन पूरी तरह से परीक्षण किया था? – aequalsb

0

xil3 उत्तर के साथ मिश्रण यह मुझे स्थानीयहोस्ट के साथ-साथ आईपी की जांच करने के लिए मिला है, ताकि आप विकास पर्यावरण में भी काम कर सकें।
आपको अभी भी परिभाषित करना होगा कि आप किस टीएलडी का उपयोग करना चाहते हैं। इसके अलावा सबकुछ ठीक काम करता है।

<?php 
function getTopLevelDomain($url){ 
    $urlData = parse_url($url); 
    $urlHost = isset($urlData['host']) ? $urlData['host'] : ''; 
    $isIP = (bool)ip2long($urlHost); 
    if($isIP){ /** To check if it's ip then return same ip */ 
     return $urlHost; 
    } 
    /** Add/Edit you TLDs here */ 
    $urlMap = array('com', 'com.pk', 'co.uk'); 

    $host = ""; 
    $hostData = explode('.', $urlHost); 
    if(isset($hostData[1])){ /** To check "localhost" because it'll be without any TLDs */ 
     $hostData = array_reverse($hostData); 

     if(array_search($hostData[1] . '.' . $hostData[0], $urlMap) !== FALSE) { 
      $host = $hostData[2] . '.' . $hostData[1] . '.' . $hostData[0]; 
     } elseif(array_search($hostData[0], $urlMap) !== FALSE) { 
      $host = $hostData[1] . '.' . $hostData[0]; 
     } 
     return $host; 
    } 
    return ((isset($hostData[0]) && $hostData[0] != '') ? $hostData[0] : 'error no domain'); /* You can change this error in future */ 
} 
?> 

आप इस

$string = 'http://googl.com.pk'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://googl.com.pk:23'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://googl.com'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://googl.com:23'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://adad.asdasd.googl.com.pk'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://adad.asdasd.googl.com.pk:23'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://adad.asdasd.googl.com'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://adad.asdasd.googl.com:23'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://192.168.0.101:23'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://192.168.0.101'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'http://localhost'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = 'https;//'; 
echo getTopLevelDomain($string) . '<br>'; 

$string = ''; 
echo getTopLevelDomain($string) . '<br>'; 

की तरह उपयोग कर सकते हैं आप इस

googl.com.pk 
googl.com.pk 
googl.com 
googl.com 
googl.com.pk 
googl.com.pk 
googl.com 
googl.com 
192.168.0.101 
192.168.0.101 
localhost 
error no domain 
error no domain 
संबंधित मुद्दे