我正在使用glob从目录中获取所有图像。但是,目录中的某些图像是缩略图,在文件扩展名之前由“-m”标识,我想从文件列表中排除这些缩略图。所以,例如可能有:
image-1.png
image-1-m.png
portrait.png
portrait-m.png
front-panel-cold.png
front-panel-cold-m.png
front-panel-warm.png
front-panel-warm-m.png
使用
foreach(glob($imdir."/*[!m].*") as $img) {
echo $img . "<br>\n";
}
我可以列出所有不以m结尾的文件,但是这也排除了front-panel-warm.png。我无法找到逃脱连字符的方法:
glob($imdir."/*[!\-m].*")
没有结果,
glob($imdir."/*[!-m].*")
给出与[!m]和
相同的结果glob($imdir."/*[!--m].*")
排除所有以n之前的任何字母结尾的文件。我也试过使用大括号
glob($imdir."/*[!{-m}].*", GLOB_BRACE)
但这似乎也不起作用。
我出错的任何想法,或者这只是我需要使用preg_match的东西?
答案 0 :(得分:1)
在这里,根据您提供的目录内容,我使用glob()函数创建了两种类型的正则表达式。在glob函数中,我搜索了很多使用两种类型的条件,但没有得到任何有用的信息,所以我用自己的方式写它。
另请阅读stackoverflow中的glob回答:Link
首先:创建一个空数组然后使用正则表达式/*[!-m].*
遍历目录,该正则表达式与文件名中包含-m
的任何文件都不匹配,并将其放入已创建的数组中的 $ ARR 强>
第二次:再次遍历第一个 foreach
中的目录,检查是否不是 in_array
并添加它
image-1.png
image-1-m.png
portrait.png
portrait-m.png
front-panel-cold.png
front-panel-cold-m.png
front-panel-warm.png
front-panel-warm-m.png
$imdir = 'img';
$arr = [];
foreach(glob($imdir."/*[!-m].*") as $img) {
$arr[] = $img;
foreach(glob($imdir."/*[!-]?.*") as $img1) {
if(!in_array($img1,$arr)) {
$arr[] = $img1;
}
}
}
echo '<pre>';print_r($arr);echo '</pre>';
<强>输出强>
Array
(
[0] => img/front-panel-cold.jpg
[1] => img/front-panel-warm.jpg
[2] => img/portrait.jpg
[3] => img/image-1.jpg
[4] => img/portrait.jpg
)
$r = array_unique($arr);
echo '<pre>';print_r($r);echo '</pre>';
根据需要输出结果:
Array
(
[0] => img/front-panel-cold.jpg
[1] => img/front-panel-warm.jpg
[2] => img/portrait.jpg
[3] => img/image-1.jpg
)
echo " ---------------- ";
echo "</br>";
foreach(glob($imdir."/??*[!-m].*") as $img) {
echo $img . "<br>\n";
}
**Output:**
img/front-panel-cold.jpg
img/image-1.jpg
img/portrait.jpg
echo " ---------------- ";
echo "</br>";
foreach(glob($imdir."/*[!-]?.*") as $img) {
echo $img . "<br>\n";
}
**Output:**
img/front-panel-cold.jpg
img/front-panel-warm.jpg
img/portrait.jpg