Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php RegEx和glob()_Php_Regex_Glob - Fatal编程技术网

Php RegEx和glob()

Php RegEx和glob(),php,regex,glob,Php,Regex,Glob,这就是我的问题 我只想从文件夹中选择那些文件,该文件夹的名称只包含具有特定文件扩展名的字母和数字 这是模式 $files = glob($somedir.'/[a-zA-Z0-9]{4,71}.{jpeg,png}',GLOB_BRACE); 当我打印它时,print\r($files)它返回一个空数组 是否可以将regex与glob()一起使用?我应该在代码中更正哪一部分 如果我的问题中有什么可以改进的地方,请告诉我。glob()不适用于正则表达式,只适用于shell模式-请参阅。而且它们是

这就是我的问题

我只想从文件夹中选择那些文件,该文件夹的名称只包含具有特定文件扩展名的字母和数字

这是模式

$files = glob($somedir.'/[a-zA-Z0-9]{4,71}.{jpeg,png}',GLOB_BRACE);
当我打印它时,
print\r($files)
它返回一个空数组

是否可以将regex与glob()一起使用?我应该在代码中更正哪一部分

如果我的问题中有什么可以改进的地方,请告诉我。

glob()
不适用于正则表达式,只适用于shell模式-请参阅。而且它们是有限的

您可以沿以下线路使用循环:

$files = array();
$dir = opendir($somedir);
while (($fname = readdir($dir)) !== false) {
  if (preg_match('/^[a-zA-Z0-9]{4,71}\.(jpeg|png)$/', $fname))
    $files[] = "$somedir/$fname";
}
closedir($dir);

这就是SPL的迭代器作为glob()的替代品非常有用的地方,它允许您使用完整的regexp

class ImageFilterIterator extends FilterIterator {
    // overwriting the accept method to perform a super simple test to
    // determine if the files found were images (types we want at least) or 
    // not..
    public function accept() {
        if (preg_match('/^[a-z0-9]{4,71}\.(gif|jpe?g|png)$/i',$this->getExtension())) {
            return true;
        } else {
            return false;
        }
    }
} 


$path = dirname(__FILE__);

foreach(new ImageFilterIterator(new FilesystemIterator($path)) as $image) {
    echo $image, PHP_EOL;
} 

我知道他们没有,但我想可能有一些模式在我的情况下会起作用。在循环中使用
preg\u match
是一个非常糟糕的主意。你可以查看
preg_grep()
我认为你能做的最好的事情就是做
??*
,这将匹配任何4个字符或更长的字符。看看这个。同样从逻辑上讲,您正在使用
{jpeg,png}
来匹配
jpeg
png
,同时您还使用了
{4,71}
作为量词。我想你可能会忘记
glob()
,而将
scandir()
preg_grep()
一起使用,这样你就可以使用更强大的正则表达式了。我知道{4,71}在我的例子中是一个量词,我已经在读那篇文章了,不过还是要谢谢你@哈姆扎,什么是
preg_match
preg_grep
之间的区别?我想说看看这个,看看手册:)@HamZa,太棒了!发布你的评论(代码)作为答案!可能直接使用
return(bool)preg_match(…)更好,更少冗余,还是“黑客”?是否黑客有争议;但这个答案是用来指向SPL迭代器中的强大选项的指针,以及展示如何使用FilterIterator的示例,因此,更明显的if/else结构不应妨碍回答的SPL端。更好的编码肯定是将
return false
移到
else
之外,然后删除
else