geo.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 646 行 · 第 1/2 页

SVN-BASE
646
字号
     * @access public     */    function getLong($latLongHashRef)    {        if (is_array($latLongHashRef)) {            $long = $latLongHashRef["LONG"];        } else {            $long = 0;        }        return sprintf("%.2f", $long);    }    /**     * Interface to the public functions     *     * @param string $methodName Lookup method     * @param mixed  $target     Address(es) to lookup     * @return array     * @access private     */    function _execute($methodName, $input)    {        // if we haven't got a service set, then do it now        if (empty($this->service)) {            $this->setService();        }        // Test the target strings in the input array.  Any targets not in        // an acceptable format will have their STATUS field set to INPUT_ERROR.        // This method will also store the standardized target into the array        // for use as a key in the cache table.        $inputArray = $this->_verifyInputFormatArray($methodName, $input);        if (PEAR::isError($inputArray)) {            return $inputArray;        }        $resultArray = $this->_processArray($methodName, $inputArray);                // if there is only one array, move the whole thing up one        if (count($resultArray) == 1) {            $resultArray = $resultArray[0];        }        return $resultArray;            }           /**     * Verify the type of the target argument and verify types of array elements     * Also converts the input array into the start of the output array     *     * @param string $methodName Lookup method     * @param mixed  $inputArray Address(es) to lookup     * @return array or pear error object on failure     * @access private     */    function _verifyInputFormatArray($methodName, $inputArray)    {        // makes sure that the input is an array        // if length is > than ARRAY_LIMIT_LENTH then bomb ou        if (count($inputArray) > $this->array_limit) {            // raise an error            $error = new PEAR_Error("Too many entries. Limit is ".$this->array_limit);            return $error;        }        // convert into a useable array        $inputArray = $this->_convertInputArray($inputArray);        return $inputArray;    }    /**     * Utility function to check what the input array     * and to convert to a correct array format for processing     *     * @param mixed $inputArray Address array     * @return array     * @access private     */    function _convertInputArray($inputArray)    {        // first check the darn thing is actually an array        if (!is_array($inputArray)) {            $inputArray = array($inputArray);        }            // now convert to the correct array form        foreach ($inputArray as $entry) {            $returnArray[]["TARGET"] = $entry;        }                return $returnArray;    }    /**      * Main function that processes addresses     *     * It might be a good idea to move the caching up one level?     *      * @param string $methodName Lookup method     * @param array  $inputArray Formatted address array     * @return array     * @access private     */    function _processArray($methodName, $inputArray)    {        $i = 0;        foreach ($inputArray as $entry) {            $entry = $this->_verifyInputFormat($entry);                    if (isset($entry["TARGET"]) && !isset($entry["INPUT_ERROR"])) {                // set up the cache work around                $GLOBALS[$this->netgeo_global] =& $this;                                if ($this->service == "localizer") {                    $response = $this->cache->call('localizer_search', $entry["TARGET"]);                } else {                    // else do the HTTP request                    $url = sprintf("%s?method=%s&target=%s", $this->default_server,                                                             $methodName, $entry["TARGET"]                                  );                    $response =& $this->cache->call($this->netgeo_global.'->_executeHttpRequest', $url);                    }                if (!isset($response)) {                    $entry["STATUS"] = NETGEO_HTTP_ERROR;                }                // parse it all into something useful                // at this point we should look for NETGEO_LIMIT_EXCEEDED as well                $dataArray[$i] = $this->_processResult($response);                            } else {                $dataArray[$i] = $entry;            }            $i++;        }                if (is_array($dataArray)) {            return $dataArray;        } else {            return array("STATUS"=>NETGEO_HTTP_ERROR);        }    }    /**     * Test the input and make sure it is in an acceptable format.  The input     * can be an AS number (with or without a leading "AS"), an IP address in     * dotted decimal format, or a domain name.  Stores the standardized targe     * string into the hash if input target is valid format, otherwise stores     * undef into hash.     *      * @param array  $inputArray Address(es) to lookup     * @return array     * @access private     */    function _verifyInputFormat($inputArray)    {        $target = trim($inputArray["TARGET"]);                // look for AS|as        if (preg_match('/^(?:AS|as)?\s?(\d{1,})$/', $target, $matches)) {            // check the AS number. Btwn 1 and 65536            if ($matches[1] >= 1 && $matches[1] < 65536) {                $standardizedTarget = $matches[0];            } else {                $inputArray["INPUT_ERROR"] = NETGEO_INPUT_ERROR;                // raise some error tex                // Bad format for input. AS number must be between 1 and 65536                return $inputArray;            }        // IP number        } elseif (preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $target, $matches)) {            if ($matches[1] <= 255 && $matches[2] <= 255 && $matches[3] <= 255 && $matches[4] <= 255) {                $standardizedTarget = $target;            } else {                $inputArray["INPUT_ERROR"] = NETGEO_INPUT_ERROR;                // raise some error tex                // Bad format for input. each octet in IP address must be between 0 and 255                return $inputArray;            }        // TLD        } elseif (preg_match('/^(?:[\w\-]+\.)*[\w\-]+\.([A-Za-z]{2,3})$/', $target, $matches)) {            $tld = $matches[1];                        // TLD length is either 2 or 3.  If length is 2 we just accept it,            // otherwise we test the TLD against the list.            if (strlen($tld) == 2 || preg_match('/^(com|net|org|edu|gov|mil|int)/i', $tld)) {                $standardizedTarget = $target;            } else {                $inputArray["INPUT_ERROR"] = NETGEO_INPUT_ERROR;                // raise some error tex                // Bad TLD in domain name. 3-letter TLDs must be one of com,net,org,edu,gov,mil,in                return $inputArray;            }        } else {            $inputArray["INPUT_ERROR"] = NETGEO_INPUT_ERROR;            // raise some error text            // unrecognized format for input            return $inputArray;        }                return $inputArray;                    }        /**     * Executes a request to the netgeo server     *     * @param array $inputArray Address(es) to lookup     * @return string Response from netgeo server     * @access private     */    function _executeHttpRequest($url)    {        $response = "";        if (function_exists('curl_init')) {            $ch = curl_init($url);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            $response = curl_exec($ch);            curl_close($ch);        } else {            // split the server url            $urlinfo = parse_url($url);            if (!isset($urlinfo["port"])) {                $urlinfo["port"] = 80;            }                    $sp = @fsockopen($urlinfo["host"], $urlinfo["port"], $errno, $errstr, $this->default_timeout);            if (!$sp) {                return false;            }                fputs($sp, "GET " . $urlinfo["path"] ."?". $urlinfo["query"] . " HTTP/1.0\r\n");            fputs($sp, "User-Agent: " . $this->useragent . "\r\n\r\n");            while (!feof($sp)) {                $response .= fgets($sp,128);            }            fclose ($sp);        }        return $response;    }       /**     * Parses the results from the server into an array     *      * @param string $response Response from netgeo server     * @return array      * @access private     */    function _processResult($response)    {        // process the localizer result differently        // since we already have an array        if ($this->service == "localizer") {            foreach ($response as $key=>$val) {                $retarray[strtoupper($key)] = $val;            }        } elseif ($this->service == "caida") {                   $lineArray = preg_split("/\n/", $response);            $line = array_shift($lineArray);            // first check for anything icky from the server            if (preg_match("/".NETGEO_HTTP_ERROR."/", $line) || preg_match('/^\s*$/', $response)) {                // empty empty empty                if (preg_match('/^\s*$/', $text)) {                    $text = "Empty content string";                    return array("STATUS"=>$text);                }            } elseif (preg_match("/".NETGEO_LIMIT_EXCEEDED."/", $line)) {                return array("STATUS"=>$text);            }            // now loop through. This should being us out at TARGET            while (isset($line) && !preg_match("/^TARGET:/", $line)) {                $line = array_shift($lineArray);            }            // keep going            while (isset($line)) {                if (preg_match("/^TARGET:\s+(.*\S)\s*<br>/", $line, $matches)) {                    $retarray["TARGET"] = $matches[1];                } elseif (preg_match("/^STATUS:\s+([\w\s]+\S)\s*<br>/", $line, $matches)) {                    $retarray["STATUS"] = $matches[1];                } elseif (preg_match("/^(\w+):\s+(.*\S)\s*<br>/", $line, $matches)) {                    $retarray[$matches[1]] = $matches[2];                }                $line = array_shift($lineArray);            }        }        return $retarray;       }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?