我正在读取单个目录中的所有文件,我想过滤JPG,JPEG,GIF和PNG。
大写和小写字母。这些是唯一可以接受的文件。
我目前正在使用这个:
$testPics = takeFiles($picsDir, "([^\s]+(?=\.(jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF))\.\2)");
并且函数takeFiles看起来像这样:
function takerFiles($dir, $rex="") {
$dir .= "/";
$files = array();
$dp = opendir($dir);
while ($file = readdir($dp)) {
if ($file == '.') continue;
if ($file == '..') continue;
if (is_dir($file)) continue;
if ($rex!="" && !preg_match($rex, $file)) continue;
$files[] = $file;
}
closedir($dp);
return $files;
}
它总是不返回任何东西。所以我的正则表达式代码肯定有问题。
答案 0 :(得分:33)
我认为你的正则表达式有问题。首先尝试在此处测试正则表达式:https://www.regexpal.com/
我认为这个可能适合你:
/^.*\.(jpg|jpeg|png|gif)$/i
注意最后的/ i - 这是“不区分大小写”标志,省去了你必须输入所有排列:)
答案 1 :(得分:11)
如何使用glob()呢?
$files = glob($dir . '*.{jpg,gif,png,jpeg}',GLOB_BRACE);
答案 2 :(得分:2)
您是否有任何理由不想使用scandir
和pathinfo
?
public function scanForFiles($path, array $exts)
{
$files = scanDir($path);
$return = array();
foreach($files as $file)
{
if($file != '.' && $file != '..')
{
if(in_array(pathinfo($file, PATHINFO_EXTENSION), $exts))) {
$return[] = $file;
}
}
}
return $return;
}
因此,您还可以检查文件是否是目录,并执行递归调用以扫描该目录。我用匆忙写了代码,所以可能不是100%正确。
答案 3 :(得分:1)
你应该在正则表达式周围添加斜杠。 - > “/(...)/"
答案 4 :(得分:1)
这对我有用
$string = "your-file-name.jpg";
preg_match("/\b(\.jpg|\.JPG|\.png|\.PNG|\.gif|\.GIF)\b/", $string, $output_array);
最佳。
答案 5 :(得分:0)
有几种方法可以做到这一点。
您是否尝试过glob()?:
$files = glob("{$picsDir}/*.{gif,jpeg,jpg,png}", GLOB_BRACE);
您是否考虑过pathinfo()?:
$info = pathinfo($file);
switch(strtolower($info['extension'])) {
case 'jpeg':
case 'jpg':
case 'gif':
case 'png':
$files[] = $file;
break;
}
如果你坚持使用正则表达式,则不需要匹配整个文件名,只需要扩展名。使用$
标记匹配字符串的结尾,并使用i
标志表示不区分大小写。另外,不要忘记在表达式中使用分隔符,在我的情况下为“%”:
$rex = '%\.(gif|jpe?g|png)$%i';
答案 6 :(得分:0)
以下是从目标目录按类型(conf for demo)编译文件数组的两种不同方法。我不确定哪个性能更好。
$path = '/etc/apache2/';
$conf_files = [];
// Remove . and .. from the returned array from scandir
$files = array_diff(scandir($path), array('.', '..'));
foreach($files as $file) {
if(in_array(pathinfo($file, PATHINFO_EXTENSION), ['conf'])) {
$conf_files[] = $file;
}
}
return $conf_files;
这将返回完整的文件路径,而不仅仅是文件名
return $files = glob($path . '*.{conf}',GLOB_BRACE);