在第一次出现字符之前删除所有内容的简单方法是什么?

时间:2012-09-07 15:31:54

标签: php

正如标题所说的那样,实际上我更感兴趣的是,我的文件名格式为1347020478_Workbook1 12.19.19.csv - 我想要做的是将时间戳从文件名的开头移开并返回其他所有内容,所以Workbook1 12.19.19.csv

我有以下代码可以正常工作:

$original_filename = explode('_', $list->file);
$timestamp         = array_shift($original_filename);
$original_filename = implode('_', $original_filename);

正如我所说,上面的代码有效,但我想知道是否有更简单的方法呢?

6 个答案:

答案 0 :(得分:9)

您可以使用stristr()ltrim()的组合来避免生成数组:

$original_filename = ltrim(stristr($list->file, '_'), '_');

参见手册:stristr返回所有haystack,从第一次出现针头开始到最后。

答案 1 :(得分:5)

您可以使用strpos()substr()等字符串函数:

$original_filename = '1347020478_Workbook1 12.19.19.csv';
echo substr( $original_filename, strpos( $original_filename, '_') + 1);

答案 2 :(得分:4)

如果你知道长度是固定的,你可以使用substr。如果没有,你可以先使用strpos。以下给出了固定长度“substr”方法1-2毫秒,“shift-implode”方法4毫秒,可变长度“substr”方法1-2毫秒。 (如果我把数组做得更大,它会耗尽内存,但你明白了。)

$loops=1000000;

$filename="1347020478_Workbook1 12.19.19.csv"; 
for ($i=0;$i<$loops;$i++){
    $fn[$i]=$filename;
}

$start1=time();
for ($i=0;$i<$loops;$i++){
    $newname=substr($fn[$i],11);    
}
$end1=time();
echo $newname." time=".($end1-$start1)."<br><br>";


$filename="1347020478_Workbook1 12.19.19.csv"; 
for ($i=0;$i<$loops;$i++){
    $fn[$i]=$filename;
}

$start1=time();
for ($i=0;$i<$loops;$i++){
    $original_filename  = explode('_', $fn[$i]);
    $timestamp          = array_shift($original_filename);
    $original_filename  = implode('_', $original_filename);    
}
$end1=time();
echo $original_filename." time=".($end1-$start1)."<br><br>";


$filename="1347020478_Workbook1 12.19.19.csv"; 
for ($i=0;$i<$loops;$i++){
    $fn[$i]=$filename;
}

$start1=time();
for ($i=0;$i<$loops;$i++){
    $st=strpos($fn[$i],"_");
    $newname=substr($fn[$i],$st+1);    
}
$end1=time();
echo $newname." time=".($end1-$start1);

答案 3 :(得分:4)

滥用时间戳长时间定长的事实,只要你的所有时间戳都落在太阳之间, 09 Sep 2001 01:46:40 GMT和周六,<强> 2286年11月20日 17:46:39 GMT,最简单的方法是:

$original_filename = substr($list->file, 11);

答案 4 :(得分:1)

尝试:

preg_replace('/^[0-9]+_/', '', $filename);

答案 5 :(得分:0)

要获取文件名列表foreach,请执行preg_replace。相同的结果,减少2步。