负模式匹配以使用glob

时间:2015-04-29 12:27:23

标签: php glob

我正在使用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的东西?

1 个答案:

答案 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