从图像文件中获取文件名详细信息

Getting File Name Details from Image File

我正在寻找一种从文件名中获取详细信息以将其插入到我的数据库中的方法。我的问题是文件名总是有点不同,即使它有一个模式。

例子: 亚利桑那-911545_1920.jpg 低音吉他-913092_1280.jpg 埃菲尔铁塔-905039_1280.jpg 纽约市-78181_1920.jpg

第一部分始终是图片的内容,例如亚利桑那、贝斯吉他、埃菲尔铁塔、纽约市,后跟唯一 ID 和图片的宽度。

我要提取的是:

名称 id 和宽度

所以如果我 运行 例如 getInfo('arizona-911545_1920.jpg');

它会 return 类似于

$extractedname
$extractedid
$extractedwidth

所以我可以像

一样轻松地将其保存在我的 mysql 数据库中
INSERT into images VALUES ('$extractedname','$extractedid','$extractedwidth')

最让我困扰的是图像名称可能会更长,例如 new-york-city-bank 甚至 new-york-city-bank-window 所以我需要一种安全的方法来获取名字,不管它有多长。

我知道如何替换名称之间的 - ,这不是问题。我真的只是在寻找一种方法来提取我上面提到的细节。

如果有人能告诉我如何解决这个问题,我将不胜感激。

谢谢:)

最好通过如下正则表达式模式提取您要查找的数据:

(.+)-(\d+_(\d+))

此处示例:https://regex101.com/r/oM5bS8/2

preg_match('(.+)-(\d+_(\d+))',"<filename>", $matches);
$extractedname = $matches[1];
$extractedid = $matches[2];
$extractedwidth = $matches[3];

编辑 - 只需重新阅读问题,您正在寻找提取技术而不是如何 post 从页面到后端的图像。我会把这个留在这里供参考。

当您 post 通过 html 中的表单向 PHP 后端提交文件时,需要的项目很少。

1) 您需要确保您的表单类型是多部分的,以便它知道要一起传递文件。

<form enctype="multipart/form-data">

2) 您的 php 后端需要遍历文件并相应地保存它们。

下面是一个如何迭代正在提交的文件的示例。

foreach($_FILES as $file) { 
        $n = $file['name']; 
        $s = $file['size']; 
        if (!$n) continue; 
        echo "File: $n ($s bytes)"; 
    } 

在这种情况下,最简单的方法之一是使用正则表达式,例如:

preg_match('/^(\D+)-(\d+)_(\d+)/', $filename, $matches);
// $matches[1] - name
// $matches[2] - id
// $matches[3] - width

这是主要思想。

我们先选择一个文件。

文件名将是 "bass-guitar-913092_1280.jpg"

首先,我们将使用 explode 将其拆分为 dot( . ) 变量 $Temp

这将为我们提供一个 bass-guitar-913092_1280jpg

的数组

我们将选择 数组的第一个项目 继续,因为这是我们感兴趣的名称,所以我们将使用 $Temp[ 0]

在此之后,我们将再次将其拆分为 ( _ )

现在我们将有一个 bass-guitar-9130921280

的数组

数组的第二个值是我们需要的,所以我们将使用 $Temp[1]

选择它

最后一部分和其他部分一样简单,我们现在将文件名 $Temp[0] 拆分为 ( - )我们将得到它的最后一个值,即 id $Temp[count($Temp)-1] 我们将从数组列表中删除它,并将其他所有内容与 implode 和我们想要的定界符

现在我们还可以使用函数 ucwords 将主名称上每个单词的每个首字母大写。

在下面的代码中,有两种获取名字的方式,一种是小写字母,一种是每个单词的首字母大写,取消注释即可。

将代码编辑为函数

<?php 
function ExtractFileInfo($fileName) {
    $Temp = explode(".",$fileName);
    $Temp = explode("_",$Temp[0]);
    $width = $Temp[1];
    $Temp = explode("-",$Temp[0]);
    $id = $Temp[count($Temp)-1];
    unset($Temp[count($Temp-1)]);
    // If you want to have the name with lowercase letters Uncomment the Following:
    //$name = implode(" ",$Temp);
    // If you Want to Capitalize every first letter of the name Uncomment the Following:
    //$name = ucwords(implode(" ",$Temp));

    return array($name,$id,$width);
}
?>

这将 return 一个包含 3 个元素名称、ID 和宽度的数组