如何检测用户输入是否为域?

时间:2013-12-20 00:55:53

标签: php preg-match

我正在为我的网站编写一些代码,我需要找到一种方法来检测用户的输入并确定它是域还是IP。如果它是一个域,它将解析域,例如, http://www.google.comgoogle.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";
    }
}
?>

3 个答案:

答案 0 :(得分:1)

您是否考虑过从另一个方向看?检测IP地址文字要比解析和验证DNS名称容易得多。

  1. 使用parse_url
  2. 解析网址
  3. $url['host']拆分'.'。如果结果是一个包含四个整数元素的数组,那么它可能是一个IP地址。
  4. 用于检查每个整数是否在适当范围内的加分点(例如,第一个八位字节为1-255,其余八位字节为0-255)。
  5. 无论如何,请使用parse_url而不是试图用正则表达式锤子破解它。

答案 1 :(得分:0)

尝试使用http://php.net/filter_var

var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));

答案 2 :(得分:0)

要检查输入是否为ip,您可以使用php的ip2longhttp://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