Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从文件名中删除php时间戳(如果存在)_Php_Regex_Timestamp_Substring - Fatal编程技术网

从文件名中删除php时间戳(如果存在)

从文件名中删除php时间戳(如果存在),php,regex,timestamp,substring,Php,Regex,Timestamp,Substring,我试图通过删除添加到图像中的时间戳来检索图像的文件名。图像可能有时间戳,也可能没有时间戳。例如,它可能采用以下格式: mylogo.1358256757.jpg 或者可能只是: mylogo.jpg 它可以是jpg、png或任何其他有效的图像文件 时间戳是使用以下方法生成的: $date = new DateTime(); $timestamp = $date->getTimestamp(); 我需要一个PHP正则表达式,它将保留原始图像名称,假设: 图像可以有任何可能的文件名,包括数

我试图通过删除添加到图像中的时间戳来检索图像的文件名。图像可能有时间戳,也可能没有时间戳。例如,它可能采用以下格式:

mylogo.1358256757.jpg

或者可能只是:

mylogo.jpg

它可以是
jpg
png
或任何其他有效的图像文件

时间戳是使用以下方法生成的:

$date = new DateTime();
$timestamp = $date->getTimestamp();
我需要一个PHP正则表达式,它将保留原始图像名称,假设:

  • 图像可以有任何可能的文件名,包括数字和数字 点,和
  • 它可能根本没有时间戳

我可以使用子字符串等,我只是想知道最安全的方法是什么。PHP时间戳是否总是正好是10位数字?

类似的方法应该可以工作:

$filename = "mylogo.1358256757.jpg";
$filename = preg_replace('/^(.*)\.\d+\.(gif|jpg|png)$/', '$1.$2', $filename);

如果您只想考虑某个位数的时间戳,例如8,您只需要限定<代码> \d<代码>:

$filename = preg_replace('/^(.*)\.\d{8,}\.(gif|jpg|png)$/', '$1.$2', $filename);
//                                  ^^^^ 8 or more digits
您还可以执行一些语义检查,以查看可疑的时间戳是否在某个窗口中。以下检查以确保文件名中嵌入的时间戳表示过去1年中的日期/时间。如果是,则进行替换,如果不是,则只返回原始文件名(此代码需要PHP 5.3.0或更高版本):

$filename=“mylogo.1358256757.jpg”;
$filename=preg\u replace\u回调(
“/^(.*)\(\d+)\(gif | jpg | png)$/”,
函数($matches){
$when=新日期时间();
if($when->setTimestamp(intval($matches[2]))!==false){
$start=新日期时间(“1年前”);
$end=新的日期时间();
//这是去年的时间戳吗?
如果($when>$start&&$when<$end){
返回$matches[1]。.$matches[3];
}
}
//似乎无效,请返回原件
//文件名。
返回$matches[0];
},
$filename);
echo$filename。“\n”;

类似的方法应该可以:

$filename = "mylogo.1358256757.jpg";
$filename = preg_replace('/^(.*)\.\d+\.(gif|jpg|png)$/', '$1.$2', $filename);

如果您只想考虑某个位数的时间戳,例如8,您只需要限定<代码> \d<代码>:

$filename = preg_replace('/^(.*)\.\d{8,}\.(gif|jpg|png)$/', '$1.$2', $filename);
//                                  ^^^^ 8 or more digits
您还可以执行一些语义检查,以查看可疑的时间戳是否在某个窗口中。以下检查以确保文件名中嵌入的时间戳表示过去1年中的日期/时间。如果是,则进行替换,如果不是,则只返回原始文件名(此代码需要PHP 5.3.0或更高版本):

$filename=“mylogo.1358256757.jpg”;
$filename=preg\u replace\u回调(
“/^(.*)\(\d+)\(gif | jpg | png)$/”,
函数($matches){
$when=新日期时间();
if($when->setTimestamp(intval($matches[2]))!==false){
$start=新日期时间(“1年前”);
$end=新的日期时间();
//这是去年的时间戳吗?
如果($when>$start&&$when<$end){
返回$matches[1]。.$matches[3];
}
}
//似乎无效,请返回原件
//文件名。
返回$matches[0];
},
$filename);
echo$filename。“\n”;

如果不强制使用正则表达式,您也可以将文件名拆分(例如分解)到“.”(点)上,只使用第一部分和第三部分,将它们粘合在一起,得到一个没有时间戳部分的文件名


问题的“if exists”部分(以最简单的形式)是检查从explode(或类似)函数返回的“token”的数量。

如果Regex不是强制性的,您也可以将文件名拆分(例如explode)到“.”(点)上,并且只使用第一部分和第三部分,将它们粘在一起,得到一个没有时间戳部分的文件名


问题的“如果存在”部分(以最简单的形式)是检查从explode(或类似)函数返回的“令牌”数量。

您可以使用
preg\u replace

您将使用以下命令获取文件名

$prevFileName = "mylogo.1358256757.jpg";
$fileName = preg_replace('/(\\.\\d+\\.)/', '.', $prevFileName);
echo $fileName;

您可以使用
preg\u replace

您将使用以下命令获取文件名

$prevFileName = "mylogo.1358256757.jpg";
$fileName = preg_replace('/(\\.\\d+\\.)/', '.', $prevFileName);
echo $fileName;

如果文件有时间戳,那么唯一可能的格式是您的示例中的格式(即filename.timestamp.extension)?“始终”在本例中是相对的,因为它是秒的量词。2050年的时间戳将是10位,
2524629600
,但3000年的时间戳将是11位,
32503701600
。好吧,我想我们可以放心地假设在未来10年时间戳将保持10位!我之所以这么问是因为,如果这是唯一的格式,那么您只需删除.timestamp,而不一定需要preg。如果文件有时间戳,那么唯一可能的格式是您的示例中的格式吗(即filename.timestamp.extension)?“始终”在本例中是相对的,因为它是秒的量词。2050年的时间戳将是10位,
2524629600
,但3000年的时间戳将是11位,
32503701600
。好吧,我想我们可以放心地假设在未来10年时间戳将保持10位!我之所以这么问是因为,如果这是唯一的格式,您只需删除.timestamp,就不一定需要preg。