如何从数组输出中删除垃圾数据

Posted

技术标签:

【中文标题】如何从数组输出中删除垃圾数据【英文标题】:How to remove garbage data from array output 【发布时间】:2019-08-03 19:19:11 【问题描述】:

我在服务器上插入多个图像,并使用 (,) 将名称存储在 SQL 数据库中。

if($request->hasFile('images'))
     $images= [];
        foreach($images=$request->file('images') as $img) 
             $name=$img->getClientOriginalName();
             $img->move(public_path().'/dpic', $name);    

            $images[]=$name;
        

    
            $test =implode(", ", $images);   
            $product->images  =$test;

图像名称连同一些显示输出的数据一起插入到数据库中。

/tmp/php59iuBb, /tmp/phpdRewVH, PicturesI.jpg, Screenshot.png

我想从输出中删除这个/tmp/php59iuBb, /tmp/phpdRewVH 我该怎么做。

请指导我这样做。

【问题讨论】:

这是个好问题。但是您不应该将客户端的原始文件名存储到数据库中。为什么?因为当您以原始名称将上传文件保存在磁盘上时,这是一个覆盖问题。万一,两个用户上传不同的文件和相同的文件名。现有文件将被替换。最好的方法是根据当前日期时间为图像创建一个新的文件名,确保在保存到磁盘和 sql 之前使用具有原始扩展名的唯一名称。 【参考方案1】:

我会这样走,希望这对你有帮助。

$images= [];

if($request->hasFile('images'))

       foreach($request->file('images') as $img) 

       $name = "some_random_sting";

       $extension = $img->getClientOriginalExtension();

       $imgName = $name .'.'.$extension;

       $img->move(public_path().'/dpic', $imgName);    

       $images[] = $imgName;
   



$test = implode(", ", $images);   
$product->images  = $test;

【讨论】:

【参考方案2】:

我会这样做

$images =[
    '/tmp/php59iuBb', '/tmp/phpdRewVH', 'PicturesI.jpg', 'Screenshot.png'
];

$images = preg_grep('~^(?!/tmp/)~', $images);

print_r($images);

输出

Array
(
    [2] => PicturesI.jpg
    [3] => Screenshot.png
)

Sandbox

简单对了!

Preg grep 对数组运行正则表达式并返回匹配项。

在这种情况下

~^(?!/tmp/)~ 否定后视 - 确保匹配不以 /tmp/ 开头

这给我们留下了我们想要的东西。

另一种选择是

 $images = array_filter($images,function($image)
               return substr($image, 0, 5) != '/tmp/';
           );

如果你没有感受到正则表达式的爱。

Sandbox

PS 我喜欢 preg_grep 它经常被忽略,因为它更容易理解但代码更冗长。 Preg Filter 是其中的另一个,您可以使用它来为整个数组添加前缀或后缀。例如,我用它来为文件名数组等添加路径。例如,这很简单:

$images =[
    '/tmp/php59iuBb', '/tmp/phpdRewVH', 'PicturesI.jpg', 'Screenshot.png'
];

print_r(preg_filter('~^(?!/tmp/)~', '/home/images/', $images));
//or you can add a whole image tag, if you want, with a capture group (.+) and backrefrence \1
print_r(preg_filter('~^(?!/tmp/)(.+)~', '<img src="/home/images/\1" />', $images));

输出

Array
(
    [2] => /home/images/PicturesI.jpg
    [3] => /home/images/Screenshot.png
)

Array
(
    [2] => <img src="/home/images/PicturesI.jpg" />
    [3] => <img src="/home/images/Screenshot.png" />
)

Sandbox

我认为您可能会发现“技巧”很有用,因为您可以删除坏的并同时添加通往好的路径。它们值得一试。

http://php.net/manual/en/function.preg-grep.php

http://php.net/manual/en/function.preg-filter.php

我觉得我应该提到匹配文件扩展名也是如此,这可能也很有用,但我将把它留到另一天。

干杯!

【讨论】:

两件小事:1. 我会使用/^(?!\/tmp\/)/ 而不是/^(?!\/tmp).+/(不需要匹配字符串的其余部分,最好添加一个斜杠以完全匹配/tmp/ 而不是@ 987654336@ 和 2。我将在最后一个示例中使用相同的正则表达式来更好地展示 preg_filter,否则它的行为与 preg_replace 完全相同(因为它只匹配所有内容)并返回不需要的路径。 @Jeto - 这些都是很好的观点,已更新。这里已经很晚了,我很惊讶我错过了/tmperature/,我还为同样的问题修复了array_filter——我非常了解正则表达式,除了环顾四周。实际上,我一直在尝试练习它们。我只是假设我需要匹配字符串中的某些内容...感谢您指出这一点!出于明显的原因,我还更改了分隔符。我在晚年滑倒。【参考方案3】:

foreach 循环语句还将图像的临时路径存储到$images

在 foreach 中更改变量名

$images=$request->file('images') tto $image=>$request->file('images')

【讨论】:

【参考方案4】:

参加聚会有点晚了,但我个人更喜欢在这里使用pathinfo 而不是正则表达式,因为它专用于文件路径:

$images = ['/tmp/php59iuBb', '/tmp/phpdRewVH', 'PicturesI.jpg', 'Screenshot.png'];

$images = array_filter($images, function ($image) 
  return pathinfo($image, PATHINFO_DIRNAME) !== '/tmp';
);

print_r($images);

演示:https://3v4l.org/6F6K8

【讨论】:

以上是关于如何从数组输出中删除垃圾数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebird 数据库中删除垃圾

mac如何还原垃圾桶删掉的

c# 并从内存中删除敏感数据和所有垃圾收集副本

Confluence 6 删除垃圾内容

从 malloc() 中提取垃圾数据的频率如何[重复]

java中的垃圾字符删除