我有一个PHP程序,用于扫描名为output
的文件夹(包含任何格式的所有图像文件)。图像文件是各种Java程序的终端(我使用Linux)输出的屏幕截图。图像文件根据main()
函数所在的类名命名。例如,如果main()
函数位于公共Example
类中,则输出屏幕截图将命名为Example
,其扩展名为.jpg
,.jpeg
,.png
或.gif
。 PHP程序有一个首页,用于扫描Java文件并将它们列在无序列表中,其中包含用户可以单击以进入下一页的链接。下一页将读取特定文件并显示源代码以及输出屏幕截图。现在,因为我使用Fedora和Fedora以png
格式截取屏幕截图,这很容易:
echo '<img src="' . $file_name . '".png>'
但是如果有人以任何格式上传带有输出屏幕截图的Java程序呢? (jpg
,jpeg
,png
,gif
)。如何加载相应的图像文件,因为我不知道扩展名是什么?
我有一个使用foreach
循环的答案并读取输出文件夹中的每个图像文件,然后使用if
条件检查具有各种扩展名的相应文件名但我认为它不是一个很好的编程实践。
我通常会尝试在编程时避免使用条件并使用更多的数学方法,因为这会给我带来我需要的挑战,而且我觉得我的代码与其他代码相比看起来不同且独特。但这次我似乎不能让它发挥作用。
我觉得这可以使用正则表达式来完成,但我不知道该怎么做。我知道正则表达式,但我甚至不知道如何使用它们。任何不使用常规的答案都会受到赞赏,但我想使用正则表达式来完成这项工作,因为这样我也会在我的正则表达式概念中添加一些知识。
感谢。
答案 0 :(得分:1)
一种可能的解决方案,您可以检查文件是否存在该扩展名(假设您没有多个具有相同名称但扩展名不同的图像):
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) . '">';
答案 1 :(得分:1)
这是使用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;
}
你无法避免使用循环。您可以遍历可能的文件名并检查它们是否存在,或者获取目录中所有文件的列表,并在执行模式匹配时循环遍历它们。
如果目录中没有很多文件,那么这个函数可能会表现得更好,因为它只需要调用一次操作系统(获取目录中的文件列表),而要求操作系统检查文件存在多次需要多次系统调用。 (我认为这是正确的......)
答案 2 :(得分:0)
您可以将模式定义为各种扩展的或列表:
$pattern = '/\.(jpg|png|gif)$/i';
我们还通过将匹配包含在一个点(转义)并确保它位于字符串($)的末尾来确保这是一个扩展。最后的“i”启用不区分大小写的匹配,以便正则表达式仍然可以在文件名中选择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";
}
是否要将其包装在函数中,取决于您,因为如果文件名与提供的扩展名不匹配,您必须决定返回什么。
另请注意,测试仅基于扩展名,而不是基于内容。