在php中返回带有句点的顶级域名

Basically the problem I am having is I need to write this function that can take a URL like www.stackoverflow.com and just return the "com". But I need to be able to return the same value even if the URL has a period at the end like "www.stackoverflow.com." This is what I have so far. The if statement is my attempt to return the point in the array before the period but I dont think I am using the if statement correctly. Otherwise the rest of the code does exactly what is supposed to do.

<?php
    function getTLD($domain)
    {

    $domainArray = explode("." , $domain);
    $topDomain = end($domainArray);
       if ($topDomain == " ")
       $changedDomain = prev(end($domainArray));
       return $changedDomain;

    return $topDomain;


    }
?>

Use regular expressions for something like this. Try this:

function getTLD($domain) {
    return preg_replace("/.*\.([a-z]+)\.?$/i", "$1", $domain );
}

A live example: http://codepad.org/km0vCkLz

Read more about regular expressions and about how to use them: http://www.regular-expressions.info/

The end function is returning an empty string "" (without any spaces). You are comparing $topDomain to single space character so the if is not evaluating to true.

Also prev function requires array input and end($domainArray) is returning a string, so, $changedDomain = prev(end($domainArray)) should throw an E_WARNING.

Since end updates the internal pointer of the array $domainArray, which is already updated when you called $topDomain = end($domainArray), you do not need to call end on $domainArray inside the if block.

Try:

if ($topDomain == "") {
   $changedDomain = prev($domainArray);
   return $changedDomain; // Will output com
}

Here is the phpfiddle for it.

Don't use a regex for simple cases like that, it is cpu costly and unreadable. Just remove the final dot if it exists:

function getTLD($domain) {
    $domain = rtrim($domain, '.');
    return end(explode('.', $domain));
}