Самый быстрый способ проверить расширение файла в списке, используя preg_match - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть список расширений файлов, которые необходимо проверить, существует ли он для любого файла (имя + расширение).

Я хочу использовать функцию preg_match, поэтому мне нужен соответствующий шаблон регулярных выражений с самыми быстрыми логами c и может создавать массив кратчайших соответствий (длина массива = 1).

Расширения файлов = jpg | jpeg | png | gif | pdf

Пример:

$pattern = ????;
$matches = '';
$result = preg_match($pattern, $filename, $matches);

Исправить Файл (имя + расширение) Ввод:

1) $filename = 'trial.gen.OO7.jpg';

2) $filename = 'http://localhost/index.php/profile/stackoverflow/0000000123.911.png?_id=900d';

3) $filename = 'fast-n-furious.pdf';

Выход:

=> $result: true
=> $matches:
    1) array( [0] => trial.gen.OO7.jpg )
    2) array( [0] => http://localhost/index.php/profile/stackoverflow/0000000123.911.png )
    3) array( [0] => fast-n-furious.pdf )

Неверный файл (имя + расширение) Ввод:

1) $filename = 'trial.gen.OO7.jpg.php';

2) $filename = 'http://localhost/index.php/profile/stackoverflow/0000000123.911.?_id=84d';

3) $filename = 'fast-n-furious';

Выход :

=> $result: false
=> $matches: array( [] )

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Следующему регулярному выражению соответствует вся строка .*, если она заканчивается в периоде \., за которым следует одно из указанных расширений файла (?:jpe?g|png|gif|pdf), при этом учитывается необязательная группа параметров запроса (?:\?\S+)?, предшествующая концу линии $:

/.*\.(?:jpe?g|png|gif|pdf)(?:\?\S+)?$/i

См. regex demo . Флаг i разрешает сопоставление без учета регистра.

В PHP:

$filename = 'http://localhost/index.php/profile/stackoverflow/0000000123.911.png?_id=900d';
$pattern = '/.*\.(?:jpe?g|png|gif|pdf)(?:\?\S+)?$/i';
$result = preg_match($pattern, $filename, $matches);

, что приводит к 1 ( означает успех ) как $result и массив, содержащий совпавшую строку как $matches.

Если вы хотите работать со списком текстов и получать только те из них, которые соответствуют шаблону, вы также можете использовать preg_grep () :

$texts = [
    'trial.gen.OO7.jpg', 
    'http://localhost/index.php/profile/stackoverflow/0000000123.911.png?_id=900d', 
    'fast-n-furious.pdf', 
    'trial.gen.OO7.jpg.php', 
    'http://localhost/index.php/profile/stackoverflow/0000000123.911.?_id=84d', 
    'fast-n-furious'
];
$results = preg_grep($pattern, $texts);

$results, затем содержит:

Array
(
    [0] => trial.gen.OO7.jpg
    [1] => http://localhost/index.php/profile/stackoverflow/0000000123.911.png?_id=900d
    [2] => fast-n-furious.pdf
)
0 голосов
/ 05 апреля 2020

После некоторой пробной версии, наконец, я решил проблему.

To: @oriberu, @WiktorStribizew, @u_mulder, et c. Спасибо за комментарии и помощь.

Вот функция для тех, кто хочет это. Не стесняйтесь копировать и вставлять этот код для разработки программного обеспечения.

/* set isFullPath argument to true for full path match result
    otherwise set to false for file name + extension result (no full path)
 */
function isMatchExtension($extList, $filePath, &$matches, $isFullPath = false) {

    $prefix = $isFullPath ? '.*' : '[^\/|\\\]*';

    /* make sure to check for "?" mark to handle file extension redundancy possibility inside the file path
        eg:
          extension files: 001|002|003|004|005|006|007

          for filePath: '/trial/profile.001/files/anyfile.007';

          then match should be: (for full path)
          => Array( [0] => /trial/profile.001/files/anyfile.007 )

          or: (for file name + extension only)
          => Array( [0] => anyfile.007 )
     */
    $pattern = "/$prefix\.(?:$extList)(?=\?)/i";

    /* we add $filePath with "?" mark to make sure the path has it.
    return preg_match($pattern, $filePath.'?', $matches);
}

// Usage Example:

$extList = 'jpg|jpeg|png|gif|pdf|html';

$filePath = 'http://localhost/index.php/profile/stackoverflow/0000000123.911.png?_id=900d';

$isFullPath = false;

$matches = [];

$isMatch = isMatchExtension($extList, $filePath, $matches, $isFullPath);

 // display result
 echo 'result: ' . ($isMatch ? 'true' : 'false') . '</br>';
 echo 'matches: </br>';
 print_r($matches);

 // the output:
 result: true
 matches:
 Array( [0] => 0000000123.911.png )
...