PHP仅将主机+ IP解析为IP地址

时间:2012-01-27 22:08:09

标签: php regex

我正试着这样做:46-121-31-23.example.net

要解析为:46.121.31.23

替换连字符并使用REGEX删除字符是不够的,因为这样做的结果将是46.121.31.23..

3 个答案:

答案 0 :(得分:5)

gethostbyname()怎么样?虽然您的特定主机名将IPv4地址编码为其“友好”名称,但无法保证始终为真。所以使用真实姓名 - > ip查询系统:DNS

$ip = gethostbyname('46-121-31-23.example.net');
echo $ip; // 46.121.31.23

评论后续:该主机名显然不存在:

marc@panic:~$ host -t ns static.012.net.il             
static.012.net.il name server pdns.goldenlines.net.il.
static.012.net.il name server sdns.goldenlines.net.il.

marc@panic:~$ host 46-121-31-23.static.012.net.il pdns.goldenlines.net.il   
Using domain server:
Name: pdns.goldenlines.net.il
Address: 212.117.129.3#53
Aliases: 

Host 46-121-31-23.static.012.net.il not found: 3(NXDOMAIN)

因此无法进行DNS查找,因为对该域具有权威性的服务器不知道您在说什么。

然而,反向映射(IP->主机名) DOES 工作:

marc@panic:~$ host 46.121.31.23
23.31.121.46.in-addr.arpa domain name pointer 46-121-31-23.static.012.net.il.

因此,由于某种原因,该提供商只进行反向映射,而不是转发。

答案 1 :(得分:1)

这样的东西?

$ip = preg_replace("/\..*/", "", $ip);
$ip = str_replace("-", ".", $ip);

尽管如此,我同意@klaustopher使用gethostbyname通常更安全:(http://php.net/manual/en/function.gethostbyname.php)。

修改

此外,您可以尝试这样做:Get IP from DNS without using gethostbyname?

答案 2 :(得分:1)

if (preg_match('/(\d{1,3})-(\d{1,3})-(\d{1,3})-(\d{1,3})/', $hostname, $ip)) {
    $ip = "{$ip[1]}.{$ip[2]}.{$ip[3]}.{$ip[4]}";
}

应该工作。