如何使用正则表达式在PHP中加载以任何文件类型扩展名结尾的图像


How to load an image ending with any file type extension in PHP using Regular Expressions?

我有一个PHP程序,它扫描名为output的文件夹(其中包含任何格式的所有图像文件(中的图像。图像文件是各种Java程序的终端(我使用的是Linux(输出的屏幕截图。图像文件是根据main()函数所在的类名命名的。因此,例如,如果main()函数位于公共Example类中,则输出屏幕截图将命名为Example,扩展名为.jpg.jpeg.png.gif。PHP程序有一个首页,它扫描Java文件,并将它们列在一个无序的列表中,用户可以点击链接进入下一页。下一页读取特定的文件,并显示源代码和输出屏幕截图。现在,由于我使用Fedora,Fedora以png格式进行屏幕截图,这很容易,比如:

echo '<img src="' . $file_name . '".png>'

但是,如果有人上传了一个Java程序,并以任何格式输出了屏幕截图,该怎么办?(jpgjpegpnggif(。既然我不知道扩展名是什么,那么如何加载合适的图像文件?

我有一个答案,使用foreach循环,读取输出文件夹中的每个图像文件,然后使用if条件检查具有各种扩展名的适当文件名,但我认为这不是一个很好的编程实践。

我通常会在编程时尽量避免出现条件,并使用更多的数学方法,因为这给了我所需的挑战,我觉得我的代码与其他代码相比看起来不同和独特,但这次我似乎无法使其发挥作用。

我觉得这可以用正则表达式来完成,但我不知道怎么做。我知道正则表达式,但我甚至不知道如何使用它们。任何不使用正则表达式的答案都将受到赞赏,但我想使用正则表达式来完成这项工作,因为这样我也会为我的正则表达式概念添加一些知识。

谢谢。

以下是使用RegEx:的MM的替代方案

 function getImageFilename ($basename, $directory) {
    $filenames = scandir($directory);
    $pattern = "/^" . $basename . "'.(jpeg|png|jpg|gif)$/";
    foreach($filenames as $filename) {
        preg_match($pattern, $filename, $matches);
        if($matches) {
            return $filename;
        }
     }
     return false;
 }

你无法避免使用循环。您可以循环浏览可能的文件名并检查它们的存在,或者获得目录中所有文件的列表并在执行模式匹配时循环浏览它们。

如果目录中没有很多文件,那么此函数可能会执行得更好,因为它只需要调用操作系统一次(以获取目录中文件的列表(,而要求操作系统多次检查文件是否存在则需要多次系统调用。(我认为这是对的…(

一种可能的解决方案是,您可以检查是否存在具有该扩展名的文件(假设您不会有多个具有相同名称但不同扩展名的图像(:

function get_image($file_name) {
    if (file_exists($file_name . '.png')) {
        return $file_name . '.png';
    } elseif (file_exists($file_name . '.jpg')) {
        return $file_name . '.jpg';
    } elseif (file_exists($file_name . '.gif')) {
        return $file_name . '.gif';
    }
    return false;
}
echo '<img src="' . get_image($file_name) . '">';

您将模式定义为各种扩展的列表:

$pattern = '/'.(jpg|png|gif)$/i';

我们还通过包含带点(转义(的匹配并确保它在字符串($(的末尾来确保这是一个扩展。末尾的"i"可以实现不区分大小写的匹配,因此regex仍然可以在文件名中拾取GIF或JPG。

之后,测试相当简单:

if (preg_match($pattern, $filename)) {
   echo "File $filename is an image";
}

把它放在一个例子中,你可以看到:

$filename = 'test.png';
$pattern = '/'.(jpg|png|gif)$/i';
if (preg_match($pattern, $filename)) {
   echo "File $filename is an image";
}

https://eval.in/618651

是否要将其封装在函数中取决于您,因为如果文件名与提供的扩展名不匹配,您必须决定返回什么。

还要注意,测试仅基于扩展,而不基于内容。