2015-04-17 5 views
1

У меня есть этот код, расположенный ниже. Я заметил, что я начинаю добавлять больше файлов, которые должны быть отфильтрованы, но теперь я хотел бы добавить расширения.Фильтровать по именам файлов и именам

Так что все, что является jpg, mp3 или vtr, также будет исключено. Честно говоря, я не уверен, что 100% как это сделать. Я пробовал без успеха.

$folder = scandir($path); 
$files = array(); 
foreach($folder as $file){ 
    if($file == '.' OR $file == '..' OR $file == 'index.htm' OR $file == 'index.html' OR $file == 'jpg'){}else{ 
     $files[$file] = filemtime($path.'/'.$file);  
    } 
} 

ответ

0
<?php 
$folder = scandir($path); 
$files = array(); 
foreach($folder as $file) 
{ 
    if (!in_array($file, array('.', '..', 'index.htm', 'index.html')) && !in_array(substr($file, -4), array('.jpg', '.mp3', '.vtr'))) 
    { 
     $files[$file] = filemtime($path.'/'.$file);  
    } 
} 
?> 

Просто добавьте исключенные расширения во втором in_array(), до тех пор, как имя расширения длиной 3 символов.

Если вы хотите исключить файлы с расширением длиной 4 символа, добавьте еще один in_array. Например:

<?php 
$folder = scandir($path); 
$files = array(); 
foreach($folder as $file) 
{ 
    if (!in_array($file, array('.', '..', 'index.htm', 'index.html')) && !in_array(substr($file, -4), array('.jpg', '.mp3', '.vtr')) && !in_array(substr($file, -5), array('.jpeg', '.mpeg'))) 
    { 
     $files[$file] = filemtime($path.'/'.$file);  
    } 
} 
?> 

зиЬзЬги извлекут имя расширения, и in_array будет убедиться, что имя внутреннего абонента не в данном списке расширений!.

+1

Я дал ему уйти, но по какой-то причине это не сработало. Я просматриваю код, чтобы увидеть, могу ли я что-то увидеть. – Arthor

+1

Произошла пропавшая скобка, я отредактировал мой код;) –

+0

Хорошо, все еще проходил через нее. Кажется, все еще не работает. Просто убедитесь, что это не я. – Arthor

0

Для этого вы можете использовать regular expressions. Это будет работать, даже если файл имеет несколько . в нем (как index.html.bak):

$folder = scandir($path); 
$files = array(); 
foreach($folder as $file){ 
    preg_match('/^(.*)(\..*)$/', $file, $matches); 

    $fileNamePart = $matches[1]; // Just the part before the extension 
    $fileExtension = $matches[2]; // The extension (like '.mp3') 
    if ($file == '.' || $file == '..' || $file == 'index.htm' || $file == 'index.html' || $fileExtension == '.mp3' || $fileExtension == '.jpeg' || $fileExtension == '.jpg' /* || other conditions ... */) { 
     // ... 
    } else { 
     $files[$file] = filemtime($path.'/'.$file); 
    } 
} 
+0

@Arthor Исправлена ​​опечатка в более ранней версии этого, но это должно делать то, что вы хотите. Дай мне знать. –

0

Вы можете использовать preg_match:

$notAllowedFileTypes = array(
    "mp3", 
    "jpg" 
); 

$folder = scandir($path); 
$files = array(); 
foreach($folder as $file){ 
    if(isAllowed($file)){ 
     //... 
    } 
} 

function isAllowed($file) 
{ 
    $notAllowedTypes = implode("|", $notAllowedFileTypes); 
    preg_match("/^.*(\.(" . $notAllowedTypes . ")?)$/", $file, $matches); 

    return count($matches) === 0; 
} 
2

Вот мое решение. Я думаю, что это довольно просто и легко поддерживать:

// put those two somewhere in conf file or something 
$allowedFiles = array(
    ".", 
    "..", 
    "index.htm", 
    "index.html" 
); 

$allowedExtensions = array(
    "mp3", 
    "jpg", 
    "png" 
); 

foreach($folder as $file){ 
    $filePathInfo = pathinfo($file); 
    if(!in_array($filePathInfo["basename"], $allowedFiles) && !in_array($filePathInfo["extension"], $allowedExtensions)) { 
     // do what you want here... 
    } 

} 

Надеюсь, это поможет!

Смежные вопросы