如何使用PHP或regex从庞大的列表中保留每个ID的第一个文件名?
我有一个巨大的文件名列表,格式为如何使用PHP或regex从庞大的列表中保留每个ID的第一个文件名?,php,regex,Php,Regex,我有一个巨大的文件名列表,格式为car-id\u picture-id.jpg如下(只是其中的一部分) 我想要的是 1201_3.jpg 1240_15.jpg 1511_0.jpg 我的目标是使用php脚本,甚至是Notepad++中的正则表达式,使每个carID只有一个图像列表,最好是每个car列表中的第一个 有办法做到这一点吗 谢谢您可以使用下面带有全局和多行标志的正则表达式 ^((\d{4})_\d+.jpg)(\n\2.+)+ 并替换为$1,或者您可以从组1中获取捕获的值 这样就可
car-id\u picture-id.jpg
如下(只是其中的一部分)
我想要的是
1201_3.jpg
1240_15.jpg
1511_0.jpg
我的目标是使用php脚本,甚至是Notepad++中的正则表达式,使每个carID只有一个图像列表,最好是每个car列表中的第一个
有办法做到这一点吗
谢谢您可以使用下面带有全局和多行标志的正则表达式
^((\d{4})_\d+.jpg)(\n\2.+)+
并替换为$1
,或者您可以从组1中获取捕获的值
这样就可以了:
<?php
$images = "
1201_3.jpg
1201_4.jpg
1201_5.jpg
1201_6.jpg
1201_7.jpg
1201_8.jpg
1201_9.jpg
1240_15.jpg
1240_16.jpg
1240_17.jpg
1240_18.jpg
1240_19.jpg
1240_2.jpg
1240_8.jpg
1240_9.jpg
1511_0.jpg
1511_1.jpg
1511_7.jpg
1511_8.jpg
";
$images_array = array_filter(explode("\n", $images));
$output = array();
foreach ($images_array as $img) {
$matches = array();
preg_match('%([^_-]+)_.*%', $img, $matches);
$car_id = $matches[1];
if(isset($output[$car_id])) continue;
$output[$car_id] = $img;
}
var_dump($output);
<代码>
也许你应该考虑如果你真的需要正则表达式… 有时最好使用字符串函数(例如,在处理时间方面)。例如,类似于:
$s = file("images.txt");
$array = array();
foreach($s as $line) {
$carId = substr($line,0,strpos($line,"_"));
if(!array_key_exists($carId,$array)) {
$array[$carId] = trim($line);
}
}
var_dump(implode("\n",$array));
你可以这样做
$images = "
1201_3.jpg
1201_8.jpg
1201_9.jpg
1240_15.jpg
1240_16.jpg
1511_0.jpg
1511_1.jpg
";
$array = array();
$foo = explode('.jpg', $images);
foreach($foo as $bar) {
$digi = substr(trim($bar), 0,4) . "<br />";
if(!in_array($digi, $array)) {
array_push($array, $digi);
echo $bar . ".jpg <br/>";
}
}
//ouput
1201_3.jpg
1240_15.jpg
1511_0.jpg
$images=”
1201_3.jpg
1201_8.jpg
1201_9.jpg
1240_15.jpg
1240_16.jpg
1511_0.jpg
1511_1.jpg
";
$array=array();
$foo=explode('.jpg',$images);
foreach($foo作为$bar){
$digi=substr(修剪($bar),0,4)。“
”;
if(!in_数组($digi,$array)){
阵列推送($array,$digi);
echo$bar.“.jpg
”;
}
}
//输出
1201_3.jpg
1240_15.jpg
1511_0.jpg
我已经用想要的输出更新了问题。为什么是正则表达式?每个图像集的第一个都有(…)
的内容,所以请使用(
)查找行,然后使用一个简单的子字符串操作将所有内容都添加到第一个空格字符。它认为他添加了这个字符以显示他想要的内容。这当然可以用awk来完成。@MarcB抱歉我的误解。the(1201)文件名旁边是帮助您确认有一个新的id。它没有出现在列表中。很抱歉,我误解了。这个(1201)文件名旁边是一个新的id,它不会出现在列表中。@Xalloumokkelos也会检查我的演示。我想说的是,使用这个regexp,你会得到每个carId的最后匹配项,而不是第一个。尽管它可以工作,但它似乎得到的是最后一个文件名,而不是第一个文件名meets@Xalloumokkelos尝试g、 请原谅我误会的错误在文件名旁边是为了帮助您知道有一个新的id。它没有出现在列表中。它可以工作,谢谢。但是我注意到在这个巨大的列表中有一件事,有几个文件名像这样5585-072.jpg 5594-5376094_2_b.jpg 5661-DSC01750.jpg
,这意味着它必须为具有-
而不是/co>的文件运行de>。所有id一开始都有4位数字。这可以编辑吗?编辑-应该可以,或者如果你知道它始终是4位的汽车id,你可以使用子字符串,但当数字变为5位时,子字符串就会断开。可能是不值得进行的微优化risk@Xalloumokkelos-有什么反馈吗?
$images = "
1201_3.jpg
1201_8.jpg
1201_9.jpg
1240_15.jpg
1240_16.jpg
1511_0.jpg
1511_1.jpg
";
$array = array();
$foo = explode('.jpg', $images);
foreach($foo as $bar) {
$digi = substr(trim($bar), 0,4) . "<br />";
if(!in_array($digi, $array)) {
array_push($array, $digi);
echo $bar . ".jpg <br/>";
}
}
//ouput
1201_3.jpg
1240_15.jpg
1511_0.jpg