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