2008-10-06 5 views
39

मैं डोमेन को बाहर निकालने के लिए एक विधि (या फ़ंक्शन) ढूंढ रहा हूं। फ़ंक्शन में खिलाए गए किसी भी URL का अगला भाग। डोमेन एक्सटेंशन कुछ भी हो सकता है (.com, .co.uk, .nl, .whatever), और इसमें जो यूआरएल खिलाया गया है वह http://www.domain.com से www.domain.com/path/script.php?=whateverआप php में किसी URL से डोमेन नाम कैसे निकालते हैं?

पर कुछ भी हो सकता है

ऐसा करने के बारे में जाने का सबसे अच्छा तरीका क्या है? इस उदाहरण $ डोमेन में

$url = 'http://www.example.com'; 
$domain = parse_url($url, PHP_URL_HOST); 

example.com शामिल करना चाहिए:

+0

की [पीएचपी उप डोमेन से डोमेन नाम हो रही है] संभव डुप्लिकेट (http://stackoverflow.com/questions/1201194/php-getting-domain-name-from- subdomain) – tripleee

उत्तर

80

parse_url एक साहचर्य सरणी में एक यूआरएल बदल जाता है:

php > $foo = "http://www.example.com/foo/bar?hat=bowler&accessory=cane"; 
php > $blah = parse_url($foo); 
php > print_r($blah); 
Array 
(
    [scheme] => http 
    [host] => www.example.com 
    [path] => /foo/bar 
    [query] => hat=bowler&accessory=cane 
) 
+0

www को बाहर निकालने का सबसे अच्छा तरीका क्या होगा। यदि डोमेन में मौजूद है तो भाग। आईएम regex के साथ अच्छा नहीं है। गंदे तरीके से मैं $ www_check = substr ($ डोमेन, 0,4) सोच सकता हूं; यदि ($ www_check == "www।") { गूंज सबस्ट्र ($ डोमेन, 4); } अन्य {echo $ डोमेन; } –

+0

@ यियोर: $ डोमेन = preg_replace ('/^www./',,,,$domain); –

+0

ईआर। वह बनाना \। नहीं । –

10

ऐसा करने के लिए parse_url() उपयोग कर सकते हैं।

+0

यह url_parse() –

+1

के बजाय parse_url() नहीं होना चाहिए नोट: parse_url के लिए दूसरा तर्क एक PHP5 आविष्कार है। PHP4 पर कोई भी (अपग्रेड, कृपया, भगवान के प्यार के लिए ...) को रॉबर्ट एलवेल के रास्ते का उपयोग करने की आवश्यकता होगी। – ceejayoz

+0

PHP4 पर कोई भी ... अपग्रेड करना होगा। –

10

तुम भी आप अपनी ज़रुरत के पाने के लिए एक नियमित अभिव्यक्ति लिख सकते हैं।

यहाँ यह पर मेरे प्रयास है:

$pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i'; 
$url = 'http://www.example.com/foo/bar?hat=bowler&accessory=cane'; 
if (preg_match($pattern, $url, $matches) === 1) { 
    echo $matches[0]; 
} 

उत्पादन होता है:

example.com 

यह पैटर्न भी इस तरह के 'example.com.au' के रूप में विचार डोमेन में ले जाता है।

नोट: मैंने प्रासंगिक आरएफसी से परामर्श नहीं लिया है।

+3

यह सभी मामलों को कवर करने का सबसे अच्छा समाधान है। धन्यवाद –

+0

क्या मैं इस रेगेक्स पैटर्न को किसी अन्य भाषा में उपयोग कर सकता हूं? – User

0

मैंने इस बारे में सोचने में कुछ समय बिताया कि क्या इसके लिए नियमित अभिव्यक्ति का उपयोग करना समझ में आता है, लेकिन अंत में मुझे नहीं लगता है।

पहले संवाददाता का regexp मुझे विश्वास दिलाता है कि यह सबसे अच्छा तरीका था, लेकिन यह पीछे की ओर स्लैश (इसलिए http://example.com, उदाहरण के लिए) गायब कुछ भी काम नहीं करता था। मैंने इसे निम्न के साथ तय किया: '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i', लेकिन फिर मुझे एहसास हुआ कि 'http://example.com/index.htm' जैसे यूआरएल के लिए दो बार मेल खाता है। उफ़। यह इतना बुरा नहीं होगा (केवल पहले का उपयोग करें), लेकिन यह इस तरह कुछ पर दो बार मेल खाता है: 'http://abc.ed.fg.hij.kl.mn/', और पहला मैच सही नहीं है। :(

एक सहकर्मी ने मेजबान (parse_url() के माध्यम से) प्राप्त करने का सुझाव दिया, और उसके बाद अंतिम दो या तीन सरणी बिट्स (split() 'पर ले लिया।') दो या तीन डोमेन की सूची पर आधारित होंगे , जैसे 'co.uk', आदि है कि सूची बनाने कठिन हिस्सा बन जाता है।

1

इस हल ...

हम dev.mysite.com कॉल कर रहे हैं कहो और हम 'mysite निकालना चाहते हैं। कॉम '

$requestedServerName = $_SERVER['SERVER_NAME']; // = dev.mysite.com 

$thisSite = explode('.', $requestedServerName); // site name now an array 

array_shift($thisSite); //chop off the first array entry eg 'dev' 

$thisSite = join('.', $thisSite); //join it back together with dots ;) 

echo $thisSite; //outputs 'mysite.com' 

mysite.co.uk के साथ भी काम करता है तो हर किसी को भी काम करना चाहिए यहां :)

+0

2 भाग टीएलडी के साथ काम नहीं करता है जब तक कि आपके पास सबडोमेन भी न हो। 'www.mydomain.co.uk // outputs 'mydomain.co.uk' mydomain.co.uk // outputs co.uk' – jaredstenquist

2

यहां एक सामान्य या लंबे डोमेन (test.sub.domain.com) या url (http://www.example.com) से रूट डोमेन (example.com) प्राप्त करने के लिए कुछ सरल कार्य हैं।)।

/** 
* Get root domain from full domain 
* @param string $domain 
*/ 
public function getRootDomain($domain) 
{ 
    $domain = explode('.', $domain); 

    $tld = array_pop($domain); 
    $name = array_pop($domain); 

    $domain = "$name.$tld"; 

    return $domain; 
} 

/** 
* Get domain name from url 
* @param string $url 
*/ 
public function getDomainFromUrl($url) 
{ 
    $domain = parse_url($url, PHP_URL_HOST); 
    $domain = $this->getRootDomain($domain); 

    return $domain; 
} 
0

केवल एक ही सही डोमेन भागों को निकालने के लिए तरीका नहीं है, इसका इस्तेमाल Public Suffix List (TLD के के लिए डेटाबेस) है।मैं TLDExtract पैकेज की सिफारिश, यहाँ नमूना कोड है:

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

$result = $extract->parse('www.domain.com/path/script.php?=whatever'); 
$result->getSubdomain(); // will return (string) 'www' 
$result->getHostname(); // will return (string) 'domain' 
$result->getSuffix(); // will return (string) 'com'