
1 abelyao 2015-03-29 14:38:33 +08:00 via iPhone 我开始怀疑楼主是来宣传网站的了… 上个帖子也一样的套路… |
3 kn007 OP @abelyao 因为昨天下午开始整理网站,所以发现了很多问题。我实在不知道这个要怎么弄了。 刚去ipip.net试了,貌似情况一样。试图google,没发现有用的。 |
4 msg7086 2015-03-29 16:11:58 +08:00 不能。数字本来就是合法的IP地址。 |
5 abelyao 2015-03-29 16:12:17 +08:00 @kn007 你举例的那几个,除了最后一个我不理解是为啥之外,其它都很好理解吧,本身就是 IP 地址的一些缩写方式,如果你一定要让纯数字范围 false 的话,可以实现判断一下,用正则或者 is_numeric 之类的函数都行。 另外可以多看看这一页的许多例子 http://php.net/manual/zh/function.gethostbyname.php |
7 kn007 OP @abelyao 最后一个? is_numeric的话,除了1、1.2,1.2.3或1.2.3.4都是false。 正则的话,匹配非合法ipv4,自然要gethostbyname,gethostbyname后,不合法的又变为合法了。 因为输入进来可能是域名也可能是ip, 判断非ip就gethostbyname,是ip直接查数据库。 问题非ip经过gethostbyname可能就被合法了。 |
8 kn007 OP @abelyao 你说的正则的法子,我是真的想了。。 真不知道怎么破。 比如ipip.net他们的框不能输入http://www.ipip.net/,无法查询,我的可以,这些都是自己写的。 现在第一步,就是格式化输入str。 第二步,判断非ip,进行gethostbyname,是ip查数据库。 现在就是卡在gethostbyname,会对数字进行格式化(long2ip)。 13.1在经过第二步,已经变成13.0.0.1了。合法了。 如果单纯十进制还好,就以is_numeric判断。 |
9 kn007 OP 我刚想了下,只能用个笨办法。 就是第一步,就是格式化输入str。 第二步,判断,是ip查数据库,不是继续下一步。 第三步,explore('.',$str)进行count()<4然后foreach判断is_numeric,如果都过就返回false,不过就gethostbyname。或正则匹配match_all,如果小于4个,就返回false,否则gethostbyname。 我去试试先 |
10 msg7086 2015-03-29 16:51:04 +08:00 如果可以的话,建议你重新提一下问题。 你主贴里说怎么判断是数字,那么上面说了is_numeric()。 能不能说清楚你到底要判断什么? |
11 iyaozhen 2015-03-29 16:56:15 +08:00 不知道楼主要干啥。本身就是正确的呀。 硬是要判断的话判断下有没有点(.)。 |
14 kn007 OP @abelyao 现在以 $ip=is_ip($ip_)?$ip : gethostbyname(pre_gethostbyname($ip_)); function pre_gethostbyname($str) { if(preg_match("/^(?:[0-9]{1,3}\.){0,2}[0-9]{1,3}$/", $str)) { return false; } return $str; } 可以解决。但又有个奇怪的问题。。。 输入 a0,abc 居然也能查询。。。我服了 <?php var_dump(gethostbyname('a0')); var_dump(gethostbyname('abc')); ?> string(13) "81.218.249.12" string(15) "162.243.117.188" @msg7086 莫非字母也能变成ip。。。26个字母都可以查。。。。 |
15 kn007 OP 已去问鸟哥了。。。感觉不科学。 |
16 msg7086 2015-03-29 21:29:55 +08:00 via iPhone 主机名不带点很正常啊… |