文件名中的php通配符

时间:2019-01-11 19:00:39

标签: php

在PHP while循环中,我具有以下内容:

$sql = mysqli_query($conn,"SELECT * FROM stock ORDER BY partnumber");
$productCount = mysqli_num_rows($sql);
if ($productCount > 0) {
    while($row = mysqli_fetch_array($sql)){ 
        $id = $row["id"];
        $partnumber = $row["partnumber"];
        $description = $row["description"];
        $price = $row["listprice"];
        $availability = $row["availability"];
        $image = "path/$partnumber.jpg";
        if(!file_exists($image)) {      //substitute image if one does not exist
            $image = "path/no-image.jpg";
        }

在表格中显示图像时,我有:

<a href="product.php?id='.$partnumber.'"><img src="'.$image.'" alt="'.$partnumber.'" /></a>

完全匹配就可以了。 问题是,许多图像在文件名中包含小写的x作为字符通配符。 如何获得这些包含x的图像文件名,以显示其文件名中包含显式字符的部件号?

示例文件名:AB2Dxxx.jpg
零件编号示例:AB2DTUV

1 个答案:

答案 0 :(得分:0)

我希望这会有所帮助-我不得不将其调整为在本地运行,但是它使用glob并假定通配符都在字符串的末尾,因此文件名可以退后直到找到匹配项。

执行路径上有一个名为images的文件夹,其中将包含我们的理论零件图像。代替数据库,我定义了一个包含测试结果的简单键/值数组(看起来您仅依靠部件号,所以这就是我定义的全部...)。

images目录包含两个文件:ABCDEF.jpgABCxxx.jpg

$parts = array( array( "partnumber"=> "ABCDEF" ), 
                array( "partnumber"=> "ABDCEF" ), 
                array( "partnumber"=> "ABCDDD" ) );

foreach($parts as $part) {

    $partnumber = $part["partnumber"];
    $next_pn = $partnumber;
    $pn_len = strlen($partnumber);
    echo $partnumber." is the part number<br>-------------<br>";
    while(strlen($next_pn) > 0 )
    {

        $image = null;
        foreach (glob("images/".$partnumber."*.jpg", GLOB_NOSORT) as $filename) {
           $image = $filename;
            echo $filename . " matches " . $partnumber."<br>";

        }
        if($image) {
            echo "<br>";
            break;
        }

        $next_pn = substr($next_pn, 0,  -1);
        $partnumber = str_pad($next_pn, $pn_len, "x");

    }


}

此输出

ABCDEF is the part number
-------------
images/ABCDEF.jpg matches ABCDEF

ABDCEF is the part number
-------------
ABCDDD is the part number
-------------
images/ABCxxx.jpg matches ABCxxx

如您所见,它基本上将采用文件名并检查是否匹配-如果未找到匹配项,它将删除一个字符并将其替换为x,然后再次进行检查。在这种情况下:

  • ABCDEF立即匹配ABCDEF.jpg

  • ABDCEF与任何文件都不匹配,并且;

  • ABCDDD在第四个循环上匹配ABCxxx.jpg(第一个检查ABCDDD,第二个ABCDDx,第三个ABCDxx,第ABCxxx个匹配)

它并不完美,可能需要更多的工作,但似乎可以完成您想要的工作。

P.S。 glob有很多选择-我已经使用NOSORT作为标志,当有很多文件要搜寻时,它倾向于帮助它更快地运行。 http://php.net/manual/en/function.glob.php