簡體   English   中英

PHP代碼段以匹配通配的IPv4字符串

[英]PHP snippet to match wildcarded IPv4 strings

我在弄清楚如何創建一個可以告訴我某個ip是否與列入黑名單的ip的數據庫(也包含通配符)的代碼段方面遇到了困難。 例:

$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個通配符會導致將所有內容都列入黑名單),但是這種編碼確實是一團糟

這樣的事情怎么樣:

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}

array('10\.10\.\d{1,3}\.\d{1,3}', '192\.168\.1\.\d{1,3}');

您還需要定界符,但可以稍后添加它們,例如preg_match('#^' + $bid + '$#', $ip) ;

\\d+代替*並使用preg_match

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM