【问题标题】:negative pattern matching to exclude certain files using glob使用 glob 排除某些文件的负模式匹配
【发布时间】:2015-04-29 12:27:23
【问题描述】:

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

【问题讨论】:

  • 使用双反斜杠转义连字符[!\\-m]
  • 看起来很违反直觉,@tzafar,就像 [!\-m] 它根本不返回任何结果。
  • 我已经检查了这个并且它工作正常glob($imdir."/*[!-m].*")
  • 它是否显示以“m”结尾但不以“-m”结尾的文件?对我来说不是这样。

标签: php glob


【解决方案1】:

使用它来排除所有以-m结尾的文件

foreach(glob($imdir."/*[!-]?[!m]?.png") as $img) {
    echo $img . "<br>\n";
}

【讨论】:

  • 我无法让您的建议生效@tsafar。它只是给出了除两个文件之外的所有文件的列表:一个是因为它不包含连字符,另一个是因为它包含 -1-m。如果它有助于澄清问题,我已经完成了一个测试页面:link
【解决方案2】:

给你,根据你提供的目录内容,我使用glob() 函数创建了两种类型的正则表达式,在 glob 函数中我搜索了很多使用两种类型的条件,但没有得到任何有用的信息,所以我已经用我自己的方式写了。 另请阅读有关 * 答案中的 glob 的信息:Link

首先: 创建一个空数组,然后使用正则表达式 /*[!-m].* 循环遍历目录,它与文件名中包含 -m 的任何文件都不匹配,并将其放入创建的数组中 $ arr.

第二次:再次循环遍历第一个foreach中的目录,如果不是in_array,再添加。 p>

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

【讨论】: