PHP 使用 version_compare () 函数判断含符号数值是否在某一区间内

之前拿ip举的例子可能不太恰当,修改一下。

/**
 * 判断变量是否在范围内
 *
 * @param string $strnum 1.1.1.1
 * @param string $min
 * @param string $max
 * @return bool
 */
function number_segment_between($strnum, $min, $max)
{
    return version_compare($strnum, $min, '>=') and version_compare($strnum, $max, '<=');
}

/**
 * 测试使用方法,为了输出结果更直观
 *
 * @param string $strnum 1.1.1.1
 */
function test_print($strnum, $min, $max)
{
    $format = "number_segment_between('%s', '{$min}', '{$max}') : ";
    print_r(sprintf($format, $strnum) . (number_segment_between($strnum, $min, $max) ? 'True' : 'False') . "\n");
}

echo '<pre>';
$min = '100.0.100.5';
$max = '100.0.100.20';
echo "测试.分隔比较:\n";
test_print('127.0.0.1', $min, $max);
test_print('1.1.1.1', $min, $max);
test_print('255.0.0.1', $min, $max);
test_print('100.0.100.5', $min, $max);
test_print('100.0.99.5', $min, $max);
test_print('200.0.100.100', $min, $max);
test_print('200.0.101.100', $min, $max);
test_print('100.0.1.10', $min, $max);
test_print('100.0.100.10', $min, $max);
echo "\n\n";

$min = '100-0-100-5-1-1';
$max = '100-0-100-20-1-1';
echo "测试-分隔比较:\n";
test_print('127-0-0-1-1-1', $min, $max);
test_print('1-1-1-1-1-1', $min, $max);
test_print('255-0-0-1-1-1', $min, $max);
test_print('100-0-100-5-1-1', $min, $max);
echo "\n\n";

$min = '100_0_100_5_0_1_0_1';
$max = '100_0_100_20_0_1_0_1';
echo "测试_分隔比较:\n";
test_print('127_0_0_1_0_1_0_1', $min, $max);
test_print('1_1_1_1_0_1_0_1', $min, $max);
test_print('255_0_0_1_0_1_0_1', $min, $max);
test_print('100_0_100_5_0_1_0_1', $min, $max);

测试.分隔比较结果输出:

number_segment_between('127.0.0.1', '100.0.100.5', '100.0.100.20') : False
number_segment_between('1.1.1.1', '100.0.100.5', '100.0.100.20') : False
number_segment_between('255.0.0.1', '100.0.100.5', '100.0.100.20') : False
number_segment_between('100.0.100.5', '100.0.100.5', '100.0.100.20') : True
number_segment_between('100.0.99.5', '100.0.100.5', '100.0.100.20') : False
number_segment_between('200.0.100.100', '100.0.100.5', '100.0.100.20') : False
number_segment_between('200.0.101.100', '100.0.100.5', '100.0.100.20') : False
number_segment_between('100.0.1.10', '100.0.100.5', '100.0.100.20') : False
number_segment_between('100.0.100.10', '100.0.100.5', '100.0.100.20') : True

测试-分隔比较结果输出

number_segment_between('127-0-0-1-1-1', '100-0-100-5-1-1', '100-0-100-20-1-1') : False
number_segment_between('1-1-1-1-1-1', '100-0-100-5-1-1', '100-0-100-20-1-1') : False
number_segment_between('255-0-0-1-1-1', '100-0-100-5-1-1', '100-0-100-20-1-1') : False
number_segment_between('100-0-100-5-1-1', '100-0-100-5-1-1', '100-0-100-20-1-1') : True

测试_分隔比较结果输出

number_segment_between('127_0_0_1_0_1_0_1', '100_0_100_5_0_1_0_1', '100_0_100_20_0_1_0_1') : False
number_segment_between('1_1_1_1_0_1_0_1', '100_0_100_5_0_1_0_1', '100_0_100_20_0_1_0_1') : False
number_segment_between('255_0_0_1_0_1_0_1', '100_0_100_5_0_1_0_1', '100_0_100_20_0_1_0_1') : False
number_segment_between('100_0_100_5_0_1_0_1', '100_0_100_5_0_1_0_1', '100_0_100_20_0_1_0_1') : True

version_compare()方法介绍

  • version_compare — 对比两个「PHP 规范化」的版本数字字符串
  • 手册地址
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 5
leo

ip2long long2ip 了解一下

5年前 评论

ipv4 地址可以转换为 32位整型。同上 @leo 所说。

5年前 评论

@leo 了解,我只是提出version_compare()的其他应用方式,比如像比较ip,但这个方法是不完善的,比如出现127.0.300.1的他也会比较。但ip2long会返回false

5年前 评论

直接比较貌似也可以

>>> '127-0-0-1-1-1'>'100-0-100-5-1-1'
=> true
>>> '127-0-0-1-1-1'<'100-0-100-20-1-1'
=> false
5年前 评论

@lovecn

>>> '100.0.99.5' >= '100.0.100.5'
=> true

这种就会出错了,出现了字符串逐位比较的情况

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!