首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于匹配通配符IPv4字符串的PHP代码片段

用于匹配通配符IPv4字符串的PHP代码片段
EN

Stack Overflow用户
提问于 2011-01-09 09:11:51
回答 2查看 88关注 0票数 0

我发现很难弄清楚如何创建一个片段来告诉我ip是否与列入黑名单的ip数据库匹配,该数据库也包含通配符。示例:

代码语言:javascript
复制
$global_blacklistedips = Array ( '10.10.*.*', '192.168.1.*' );

function checkBlacklistedIp ( $ip ) {

    // some kind of regular expression

    // match? return true;
    // else return false;
}

有人能帮上忙吗?我想出的唯一方法是编写一个非常丑陋的“状态机”,它在1、2或3个通配符之间切换(4个通配符将导致将所有内容列入黑名单),但这种编码真的很混乱

EN

回答 2

Stack Overflow用户

发布于 2011-01-09 09:22:07

这样如何:

代码语言:javascript
复制
function to_regex($ip) {
    return '/^' . str_replace(array('*', '.',), array('\d{1,3}','\.'), $ip) . '$/';
}

$global_blacklistedips = array_map('to_regex', $global_blacklistedip);

function checkBlacklistedIp ($ip, $global_blacklistedips ) {
    foreach($global_blacklistedips as $bip) {
        if(preg_match($bip, $ip)) {
           return true; 
        }
    }
    return false;
}

这将首先将所有黑名单IP转换为正则表达式。然后,该函数循环遍历这些值,并尝试匹配它们。

你也可以从一开始就把你的IP写成正则表达式,你只需要转义点.并用例如\d{1,3}替换*

代码语言:javascript
复制
array('10\.10\.\d{1,3}\.\d{1,3}', '192\.168\.1\.\d{1,3}');

您还需要分隔符,但您可以稍后添加它们,如preg_match('#^' + $bid + '$#', $ip)

票数 0
EN

Stack Overflow用户

发布于 2011-01-09 09:22:22

*替换为\d+并使用preg_match

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4637154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档