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 + -
显示快捷键?