【问题标题】:Getting File Name Details from Image File从图像文件中获取文件名详细信息
【发布时间】:2015-10-24 21:19:33
【问题描述】:

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

示例: 亚利桑那州-911545_1920.jpg 贝斯-吉他-913092_1280.jpg 埃菲尔铁塔-905039_1280.jpg 纽约市-78181_1920.jpg

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

我所追求的是提取:

名称id和宽度

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

它会返回类似

的东西
$extractedname
$extractedid
$extractedwidth

这样我就可以轻松地将它保存在我的 mysql 数据库中,例如

INSERT into images VALUES ('$extractedname','$extractedid','$extractedwidth')

最困扰我的是图像名称可能更长,例如 new-york-city-bank 甚至 new-york-city-bank-window 所以我需要一种安全的方法来获取名称,无论多长时间这将是。

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

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

谢谢:)

【问题讨论】:

  • 这听起来很简单,但只要读到一个数字就行了。

标签: php extract filenames


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是主要思想。

    让我们先选择一个文件。

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

    首先,我们将用 explode 将其拆分为变量 $Temp

    中的 dot( . )

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

    的数组

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

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

    现在我们将拥有一组 bass-guitar-9130921280

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

    来选择它

    最后一部分和其他部分一样简单,我们现在将文件名 $Temp[0]( - ) 分开我们将得到它的 Last 值这是 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);
    }
    ?>
    

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

    【讨论】:

    • 拒绝一个答案,仅仅因为不使用正则表达式是荒谬的。仅仅因为您熟悉它们,并不意味着其他所有人都应该或不意味着这个答案不起作用,或者它是不可接受的。这只是一个简单的例子来说明如何做到这一点。这只是一个替代答案。
    • 我认为你的解决方案与正则表达式相比有开销,但我没有反对它。
    • 正则表达式更省时,但是对于不熟悉这些的用户来说,这个例子会让他们明白自己在做什么,而不是简单的复制粘贴一个“古老的巫术咒语” " 为他们。
    • 感谢您的回答,因为它解释了很多。我只需要公平地选择第一个答案,因为它也有效。但是,这里的解释更有帮助,所以谢谢你
    • 您可以随时为有用的答案投票 :) 乐于助人。编辑:您也不必总是选择第一个有效的答案,但答案对您的帮助最大。 :)
    【解决方案3】:

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

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

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

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

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

    当您通过 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)"; 
        } 
    

    【讨论】:

    • 您是否发布了一些与文件上传无关的问题信息?答案如何?
    • 是的,那是因为我看错了问题,所以我添加了正确答案的编辑。
    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 2013-05-29
    • 2012-03-22
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多