如何从数组输出中删除垃圾数据
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
【讨论】:
以上是关于如何从数组输出中删除垃圾数据的主要内容,如果未能解决你的问题,请参考以下文章