免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3743 | 回复: 17
打印 上一主题 下一主题

[字符串]?字符串比较问题--ip段比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-23 11:01 |只看该作者 |倒序浏览
要比较新输入的ip地址是否和已经有的ip地址段相同,若相同执行语句a,不同执行语句b。

ip 地址在数据库中数据类型是字符串
当新输入ip 如:a.b.c.d 怎么实现与数据库中已经有的ip比较呢?

我曾经想过取字符串前N个字符赋予临时变量,然后比较,但问题是a b c d每个都有可能是1-3个字符。
所以我想能不能取得字符串第三个.之前的赋予临时变量呢?

如果能,那么怎么做呢?

如果用strtok()函数,分隔符是什么呢? --能定义第三个.为分割符么? HOW TO?

[ 本帖最后由 teczm 于 2006-5-23 11:02 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-23 11:08 |只看该作者
用PHP截出该段IP字符串,用LEFT去数据库截子串比较

left(ip,length('192.168')) = '192.168';

论坛徽章:
0
3 [报告]
发表于 2006-05-23 11:14 |只看该作者
谢谢回复。
但是这个方法似乎不可行
因为,ip不仅仅是192.168.0.0/8 如果新ip是12.16.24.5 或者其他任意ip地址的话 应该不能实现吧。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
4 [报告]
发表于 2006-05-23 11:17 |只看该作者
采用最简单的方法,全部补足到三位,不足的补0

论坛徽章:
0
5 [报告]
发表于 2006-05-23 11:30 |只看该作者
这个方法好 谢谢

论坛徽章:
0
6 [报告]
发表于 2006-05-23 11:35 |只看该作者
255.255.255.255 = (FFFFFFFF)16 = (4294967295)10

a.b.c.d = a * (1000000)16 + b * (10000)16 + c * (100) + d = a * 16777216 + b * 65536 + c * 256 + d

将IP地址转为整数然后比较大小就可以~~效率高,速度快,计算简单~~

论坛徽章:
0
7 [报告]
发表于 2006-05-23 11:35 |只看该作者
for循环里的3也可以为1,2来匹配A,B类的地址

<?php
$x = '1.1.1.1';
$y = '1.1.1.2';
if (preg_match('/(\d+).(\d+).(\d+).(\d+)/', $x, $m_x) && preg_match('/(\d+).(\d+).(\d+).(\d+)/', $y, $m_y)) {
        for ($i = 1; $i <=3; $i++) {
                if ($m_x[$i] == $m_y[$i]) $f = 1;
                else {$f = 0;break;}
        }
}
echo $f;
?>

[ 本帖最后由 netwenk 于 2006-5-23 11:37 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-05-23 11:48 |只看该作者
原帖由 mikespook 于 2006-5-23 11:35 发表
255.255.255.255 = (FFFFFFFF)16 = (4294967295)10

a.b.c.d = a * (1000000)16 + b * (10000)16 + c * (100) + d = a * 16777216 + b * 65536 + c * 256 + d

将IP地址转为整数然后比较大小就可以~~效率高, ...

这样的话abcd应该设置为int了哦
恩 这个方法也不错 。

论坛徽章:
0
9 [报告]
发表于 2006-05-23 11:53 |只看该作者
原帖由 netwenk 于 2006-5-23 11:35 发表
for循环里的3也可以为1,2来匹配A,B类的地址

<?php
$x = '1.1.1.1';
$y = '1.1.1.2';
if (preg_match('/(\d+).(\d+).(\d+).(\d+)/', $x, $m_x) && preg_match('/(\d+).(\d+).(\d+).(\d+)/', $y, ...

这个好

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
10 [报告]
发表于 2006-05-23 11:58 |只看该作者
原帖由 netwenk 于 2006-5-23 11:35 发表
for循环里的3也可以为1,2来匹配A,B类的地址

<?php
$x = '1.1.1.1';
$y = '1.1.1.2';
if (preg_match('/(\d+).(\d+).(\d+).(\d+)/', $x, $m_x) && preg_match('/(\d+).(\d+).(\d+).(\d+)/', $y, ...



仅仅为了比较这么做可以,但是要入库检查就不行了。

三位补足放入数据库,可以索引,效果也很好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP