Проверьте, содержит ли имя файла IP — адрес, и получите бесплатное имя файла PHP

#php #ip-address #php-7.4

Вопрос:

Я пытаюсь проверить, содержат ли файлы в каталоге определенный ip-адрес. Если IP-адрес не найден в имени файла, я хочу, чтобы файл с не найденным IP-адресом в имени файла был перемещен туда.

Вот мой сценарий:

 <?php

function ip_range($start = "10.100.1.2", $end = "10.100.255.254"){
    $start = ip2long($start);
    $end = ip2long($end);
    return array_map('long2ip', range($start, $end));
}
function check_filename(){

    $ip_address_list = ip_range();
    $dir_files = scandir("/mnt/dumps/");
    foreach($ip_address_list as $ip){
        foreach($dir_files as $file){
            if($d = glob($ip)){
                if(empty($d)){
                    $fpath = "/mnt/dumps/{$ip}_public.txt";
                    echo $fpath;
            }
        }
        if(isset($fpath)){
            return $fpath;
        }
        if(isset($fpath)){
            return $fpath;
        }

    }

};

?>
 

Но когда я выполняю скрипт, он возвращает меня как пример 10.100.1.2 — но файл, содержащий этот IP-адрес, уже существует. На самом деле это не то, чего я хочу.

Не могли бы вы сказать мне, что я сделал не так? Спасибо!

Редактировать:

Я изменил сценарий:

 function ip_range($start = "10.100.1.2", $end = "10.100.255.254"){
    $start = ip2long($start);
    $end = ip2long($end);
    return array_map('long2ip', range($start, $end));
}

function check_filename(){

    $ip_address_list = ip_range();
    $dir_files = scandir("/mnt/dumps/");
    echo "<pre>"; print_r($dir_files); echo "</pre>";
    foreach($ip_address_list as $ip){
        $new_ip = preg_quote($ip);
        foreach($dir_files as $file){
            if(!preg_match("/^{$new_ip}_public.{0,10}.txt/", $file)){
                $fpath = "/mnt/dumps/{$ip}_public.txt";
            }
        }
        if(isset($fpath)){
            return $fpath;
        }
    }

};


 

Комментарии:

1. Вероятно, вам придется изменить это: [код], если($d = glob($файл, «{$ip}») == false)

2. @ChrisHaas Я отредактировал свой сценарий сейчас, чтобы if($d = glob($ip)){ if(empty($d)){ $fpath = "/mnt/dumps/{$ip}_public.txt"; echo $fpath; print_r($d); return;

3. Отредактировано — но все равно работает не так, как ожидалось.

4. Хорошо ли структурирована папка с этими файлами? Если да, можете ли вы просто использовать file_exists ? $test_path = "/foo/bar/{$ip}.txt";if (!file_exists($test_path)) {/*Move file here*/}

5. @ChrisHaas на самом деле нет. Файлы имеют такие имена, как 10.100.1.2_public.txt и 10.100.1.2_public@2.txt . Вот почему я попробовал это с регулярным выражением

Ответ №1:

Вероятно, вам придется изменить, если из

 if($d = glob($file, "{$ip}") == false)
 

Для

 if($file == $ip)
 

PS. проверьте документацию на предмет глобуса: https://www.php.net/manual/en/function.scandir.php