etrader Posted April 28, 2011 Share Posted April 28, 2011 What is the easiest way to get the value of subdomain. For example, when browsing word1.example.com; how to get it (like $_GET['q']) to put "word1" into an string. Quote Link to comment Share on other sites More sharing options...
JKG Posted April 28, 2011 Share Posted April 28, 2011 is this any use to you? <?php $urlParts = explode('.', $_SERVER['HTTP_HOST']); echo($urlParts[1]); //or 0 if no www ?> EDIT: to actually answer your question <?php $urlParts = explode('.', $_SERVER['HTTP_HOST']); $variable = $urlParts[1]; //or 0 if no www ?> Quote Link to comment Share on other sites More sharing options...
etrader Posted April 29, 2011 Author Share Posted April 29, 2011 I think you mean $urlParts[0]. But even in the case, the problem appears when we are on the main domain. For example.com; it will return "example" Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted April 29, 2011 Share Posted April 29, 2011 This is not an easy task to do, but I sat here and figured out a way because it interests me. I first parse the url, then find the main host, compared the values, I insert a www. to the front of the main host so there is always a position zero in the array. Then exploded the array and use position zero as the subdomain. Basically if there is no subdomain it will always be www. , because www. is actually a subdomain. <?php $url = mysql_real_escape_string($_GET['url']); if (substr($url, 0, 5) != "http:") { $url = "http://$url"; } function getsubdomain($new_parse_url) { $parsedUrl = parse_url(strtolower($new_parse_url)); $parse_url = trim($parsedUrl[host] ? $parsedUrl[host] : array_shift(explode('/', $parsedUrl[path], 2))); $slds = '\.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'; preg_match ( "/^(http:\/\/|https:\/\/|)[a-zA-Z-]([^\/]+)/i", $parse_url, $thematches ); $host = $thematches[2]; if (preg_match("/$slds$/", $host, $thematches)) { preg_match ( "/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $thematches ); } else { preg_match ( "/[^\.\/]+\.[^\.\/]+$/", $host, $thematches ); } if($parse_url == $thematches[0]){ $urlParts = "www.$thematches[0]"; } else { if (substr($parse_url, 0, 4) != "www.") { $parse_url = "www.$parse_url"; } $urlParts = $parse_url; } $subParts = explode('.', $urlParts); $subdomain = $subParts[0]; return $subdomain; } $subdomain = getsubdomain($url); echo $subdomain; ?> Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted April 29, 2011 Share Posted April 29, 2011 Well if is no subdomain I'm getting the first part of the host domain, is something that still needs work. Maybe just exploding them, counting the positions up until the main host may work. No time to work on this until day after tomorrow. Quote Link to comment Share on other sites More sharing options...
JKG Posted April 29, 2011 Share Posted April 29, 2011 i dont know if that over complicates it... would this not do the trick? <?php $url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . $_SERVER['QUERYSTRING']; $urlParts = explode('.', $_SERVER['HTTP_HOST']); if(strpos($url, 'www')){ $subdomain_value = $urlParts[1]; } else { $subdomain_value = $urlParts[0]; }; echo $subdomain_value; ?> and even then you can whittle that code down loads... Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted April 30, 2011 Share Posted April 30, 2011 I believe etrader wants to read from different urls and find the subdomains only. The problem arises when there is no www, and also no subdomain value, it would read the subdomain as being the first part of a domain name. I don't believe what I did over complicates it at all, because it's kind of a difficult task to accomplish. It can't just be simple explodes because the amounts and the values of the positions may change. I believe is just one more step needed in the code I made, to check for a match if the first part domain name comes up as the subdomain, then just call it www as the subdomain instead. I'll fiddle with in in a little bit and get it working. Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted April 30, 2011 Share Posted April 30, 2011 OK, I finally got some time to get this working. It will find the subdomain of a url, if no subdomain is present the subdomain will be www. I have the common levels for domain patterns for the preg_match, if I missed any or need more, add them in. <?php //getting url from address bar //http://mysite.com/this-script-name.php?url=subdomain.domain.co.uk $url = mysql_real_escape_string($_GET['url']); function getsubdomain($new_parse_url) { //if empty value display www and exit if($new_parse_url == ""){ return "www"; EXIT; } //add http:// if is not present if (substr($new_parse_url, 0, 5) != "http:") { $new_parse_url = "http://$new_parse_url"; } //parse and clean the url $parsedUrl = parse_url(strtolower(trim($new_parse_url))); $parse_url = $parsedUrl[host] ? $parsedUrl[host] : array_shift(explode('/', $parsedUrl[path], 2)); //patterns for preg_match of second level domains $slds = '\.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'; //sorting to just get domain preg_match ( "/^(http:\/\/|https:\/\/|)[a-zA-Z-]([^\/]+)/i", $parse_url, $thematches ); //host position $host = $thematches[2]; //explode the parsed url into parts $explode_parse = explode(".",$parse_url); //subdomain is position zero $subdomain = $explode_parse[0]; //count the parts $count_positions = count($explode_parse); //check if second level domain exists if (preg_match("/$slds$/", $host, $thematches)) { preg_match ( "/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $thematches ); //counting positions so host is not used as subdomain if($count_positions <= 3){ $subdomain = "www"; } } else { //if second level domain does not exist preg_match ( "/[^\.\/]+\.[^\.\/]+$/", $host, $thematches ); //counting positions so host is not used as subdomain if($count_positions <= 2){ $subdomain = "www"; } } //return the subdomain return $subdomain; } //usage $subdomain = getsubdomain($url); echo $subdomain; ?> Quote Link to comment Share on other sites More sharing options...
ignace Posted May 1, 2011 Share Posted May 1, 2011 QuickOldCar you scare me! return "www"; EXIT; You do realise that EXIT; will never be executed, do you? $url = mysql_real_escape_string($_GET['url']); This will actually put FALSE into $url when it can't establish a MySQL connection (when mysql_connect() with zero parameters fails). You also don't need to call it since you don't actually store the value in MySQL. $parsedUrl[host] ? $parsedUrl[host] : array_shift(explode('/', $parsedUrl[path], 2)); No quotes around string indexes? Always place your functions at the bottom of your scripts so that it remains readable and understandable. Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted May 1, 2011 Share Posted May 1, 2011 All I can say is it works. When is no value it doesn't output anything but www, if the exit is extra so be it. The mysql real escape is a habit because I usually do input into mysql, but it still does work exactly the way I have it. It's was just a demo anyway. The function is what the person needs. As for the parsing of url functions, it doesn't need any quotes and when you do it breaks. You can even look here and see not one of them are quoted when multiple parses are used. http://php.net/manual/en/function.parse-url.php I will forever place my functions up top so they can be accessed multiple times if needed without having to be defined first. If I was to include the function, that's where it would be. Feel free to make changes and then post your "fixed" version. Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted May 1, 2011 Share Posted May 1, 2011 Ahh, I see what you meant now. $parse_url = $parsedUrl['host'] ? $parsedUrl['host'] : array_shift(explode('/', $parsedUrl['path'], 2)); Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.