我正在为我的网站编写一些代码,我需要找到一种方法来检测用户的输入并确定它是域还是IP。如果它是一个域,它将解析域,例如, http://www.google.com
到google.com
,然后解析它并将其回显到用户输入字段。如果是IP,则它将跳过所有这些步骤并保留在IP用户输入字段中。
这是我到目前为止所做的:
<?php
if( $_POST['submit'] )
{
$ip_address=$_POST["host"];
if (ctype_alpha($ip_address))
{
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i', $ip_address, $matches);
$host = $matches[1];
// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
$new_ip_address = $matches;
//resolve parsed ip
$presolved = gethostbyname($new_ip_address);
}
else
{
echo "Do stuff.\n";
}
}
?>
答案 0 :(得分:1)
您是否考虑过从另一个方向看?检测IP地址文字要比解析和验证DNS名称容易得多。
parse_url
$url['host']
拆分'.'
。如果结果是一个包含四个整数元素的数组,那么它可能是一个IP地址。无论如何,请使用parse_url
而不是试图用正则表达式锤子破解它。
答案 1 :(得分:0)
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));
答案 2 :(得分:0)
要检查输入是否为ip,您可以使用php的ip2long
(http://php.net/manual/en/function.ip2long.php)
请参阅下面的示例,该示例将返回IP或false。
<?php
function checkOrMakeIp($address) {
$long = ip2long($address);
if ($long != -1 || $long !== FALSE) {
// It is a IP, just return the address
return $address;
} elseif($ip = gethostbynamel($address)) {
// It is a hostname, but now we have the ip, return it
return $ip[0];
}
return false;
}
?>
注意gethostbynamel
,如果无法解析主机名,它将返回FALSE;否则是阵列。 (http://www.php.net/manual/en/function.gethostbynamel.php)