【问题标题】:How to detect if user input is a domain?如何检测用户输入是否是域?
【发布时间】:2013-12-20 00:55:53
【问题描述】:

我正在为我的网站编写一些代码,我需要找到一种方法来检测用户的输入并确定它是域还是 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";
    }
}
?>

【问题讨论】:

  • 我认为http:// 的存在(或缺少)与IP 地址无关,除非这纯粹是为了在网页上显示——浏览器将采用该协议。另外,https 呢?
  • @Michael 喜欢它! user2934716,您也应该查看该问题的已接受答案:stackoverflow.com/a/11046121/2812842
  • 我会使用类似于(?:^.*?//)?(.*?)[:/]? 的正则表达式来捕获“可能的域名”。这应该匹配来自http://foo.com:80、//foo.com、foo.com/bar 等的foo.com。如果foo.com 没有碰巧解析为IP,或者它们“意外离开子域”,那么......哦,好吧:你想帮忙。
  • (此外,并非所有注册的域都连接到 IP:在某些情况下可能需要“whois”。)

标签: php preg-match


【解决方案1】:

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

  1. 用parse_url解析URL
  2. 将$url['host'] 拆分为'.'。如果结果是一个由四个整数元素组成的数组,那么它可能是一个 IP 地址。
  3. 检查每个整数是否在适当的范围内(例如,第一个八位字节为 1-255,其余八位字节为 0-255)的奖励积分。

无论如何,请使用parse_url,而不是尝试用正则表达式锤子破解它。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 目前适用于所有答案:我很困惑,我是否想将我所拥有的所有内容更改为那个或哪个部分?
    【解决方案3】:

    要检查输入是否为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)

    【讨论】:

    • 这似乎是我所追求的,但我无法让它工作。您有可以向我提供进一步帮助的电子邮件或其他信息吗?
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2014-06-30
    相关资源
    最近更新 更多