Помогите с регуляркой в PHP

148
18 октября 2017, 07:34

В корне сайта есть каталог ./temp/с лог файлами по заявкам.

Есть такой код:

$scandir = scandir('./temp/', TRUE);

Который получает список заявок:

[0] => 23339_19-09-2017_14:34:15_post.log
[1] => 23339_19-09-2017_14:34:15_charge.log
[2] => 23316_15-09-2017_03:37:20_2co.log
[3] => 23316_15-09-2017_03:37:10_post.log
[4] => 23316_15-09-2017_03:37:10_charge.log

Мне нужно написать функцию, которая будет находить имя файла по id заказа. Например: Хочу получить имя файла по id = 23316, функция должна выдать имя файла 23316_15-09-2017_03:37:10_post.log

Answer 1

Этот вариант найдет все файлы, начинающиеся с 23316 и заканчивающиеся на post.log

$need = '23316';
$array = [
    '23339_19-09-2017_14:34:15_post.log',
    '23316_15-09-2017_03:37:20_2co.log',
    '23339_19-09-2017_14:34:15_charge.log',
    '23316_15-09-2017_03:37:10_post.log'
];
echo '<pre>', print_r(need_file($array, $need), 1), '</pre>';

function need_file($arr, $need) {
    return array_filter($arr, function($item) use($need) {
        return preg_match('~^'. $need .'.+_post.log$~', $item);
    });
}
Answer 2
$files = [
    0 => '23339_19-09-2017_14:34:15_post.log',
    1 => '23339_19-09-2017_14:34:15_charge.log',
    2 => '23316_15-09-2017_03:37:20_2co.log',
    3 => '23316_15-09-2017_03:37:10_post.log',
    4 => '23316_15-09-2017_03:37:10_charge.log'
];

Мне нужно написать функцию, которая будет находить имя файла по id заказа.

function findLogById($id){
    global $files;
    foreach($files as $f){
        if(preg_match("/^$id.+_post.log$/i", $f)){
            return $f;
         }
    }
    throw new Exception("no log file for ID#$id");
}

выведет первый подходящий файл.

Answer 3

А функция glob() интереснее (примеры на моих данных):

$id = '59';
$delimiter = '-';
$tail = '.7z';
$arr = glob("{$id}{$delimiter}*{$tail}");
var_dump($arr);

Результат

array(3) {
  [0]=>
  string(10) "59-0020.7z"
  [1]=>
  string(10) "59-0021.7z"
  [2]=>
  string(10) "59-0022.7z"
}
$folder = '../bin/php/php-7.2.0RC4-Win32-VC15-x86/';
$id = 'lib';
$delimiter = '';
$tail = '.dll';
$arr = glob("{$folder}{$id}{$delimiter}*{$tail}");
var_dump($arr);

Результат

array(7) {
  [0]=>
  string(56) "../bin/php/php-7.2.0RC4-Win32-VC15-x86/libcrypto-1_1.dll"
  [1]=>
  string(53) "../bin/php/php-7.2.0RC4-Win32-VC15-x86/libenchant.dll"
  [2]=>
  string(48) "../bin/php/php-7.2.0RC4-Win32-VC15-x86/libpq.dll"
  [3]=>
  string(50) "../bin/php/php-7.2.0RC4-Win32-VC15-x86/libsasl.dll"
  [4]=>
  string(52) "../bin/php/php-7.2.0RC4-Win32-VC15-x86/libsodium.dll"
  [5]=>
  string(50) "../bin/php/php-7.2.0RC4-Win32-VC15-x86/libssh2.dll"
  [6]=>
  string(53) "../bin/php/php-7.2.0RC4-Win32-VC15-x86/libssl-1_1.dll"
}
READ ALSO
Нужно очистить файл txt каждые 10 часов [дубликат]

Нужно очистить файл txt каждые 10 часов [дубликат]

Данный вопрос уже был задан и имеет решение:

159
php7 и вывод данных помогите разобраться

php7 и вывод данных помогите разобраться

Добрый день! Делаю некотрые переделки в сайте и не могу разобраться с выводом и работой такого дела как:

163
Как получить пароль с запроса mysql?

Как получить пароль с запроса mysql?

Пытаюсь сделать проверку авторизации пользователяДелаю проверка по нику, а потом нужно как то получить пароль и сравнить

167
Как лучше всего передать русский текст по ссылке

Как лучше всего передать русский текст по ссылке

Из прошлого вопроса у меня хорошо получилось отправить и принять кавычки через функцию htmlspecialchars (прописал там где отправлял в ссылке и там...

159