使用PHP将字符串分解两次

使用PHP将字符串分解两次,php,explode,Php,Explode,我在SO上看到了两个类似的问题&但仍然卡住了 我有一个像catalog/reviews/249532-20691-5369.jpg这样的文件路径字符串,我只想得到像249532-20691-5369这样的数字 我采用以下方法: $id1 = explode('/', $image['img_link']); $id2 = explode('.', $id1[2]); echo $id2; //output 249532-20691-5369 在controller中是否有执行此任务的最佳方

我在SO上看到了两个类似的问题&但仍然卡住了

我有一个像catalog/reviews/249532-20691-5369.jpg这样的文件路径字符串,我只想得到像249532-20691-5369这样的数字

我采用以下方法:

$id1 = explode('/', $image['img_link']);
$id2 = explode('.', $id1[2]);
echo $id2;  //output 249532-20691-5369 
在controller中是否有执行此任务的最佳方法

如果您有不同的文件扩展名,可以选择:

echo pathinfo ( $image['img_link'] ,  PATHINFO_FILENAME );
explode返回一个数组,因此需要访问第一个元素:

$ids = explode('/', $image['img_link'];
$id2 = explode('.', end($ids));

echo $id2[0];
或者,您可以只使用basename而不是第一次分解,前提是您始终具有.jpg扩展名:

echo basename($image['img_link'], '.jpg');

在您的例子中,可以使用一个简单的正则表达式

([^\/]+)\.jpg$
在php中,这看起来像这样

preg_match('/([^\/]+)\.jpg$/', $image['img_link'], $m);
echo $m[1];
如果你需要任何扩展,你可以使用这个

([^\/]+)\.[^\.]+$
那么这是如何工作的:

我们从右边开始,因此在以$结尾的行中添加一个锚。从那以后,我们需要扩展,它几乎是除点[^\.]+之外的所有东西。剩下的是文件名,它是从点到斜杠[^\/]+的所有内容。这个部分也包含在一个捕获组中,以便最终使用$m[1]访问它。

您可以使用Regex

这种模式将起作用:

(\d{6}-\d{5}-\d{4})
细分:

\d表示任何数字 {}表示值的计数,当然还有数字之间的破折号。 用括号将整个内容括起来以捕获整个结果 代码:

输出:

249532-20691-5369

如果字符串总是那样,这是一种很好的方法。如果字符串是不同的,正则表达式可能是一个更好的选择,因为数字的长度总是相同的。如果你真的愿意,你可以使用正则表达式,但是如果你所拥有的东西对你有用,为什么要担心呢。是的…总是相同的长度…@JonStirling,我与你没有太多相似之处regex@MuhammadHashirAnwaar那就坚持你所知道的吧?非常简单!但它仍然包含.jpg文件extension@Philipp检查updatedwhat if extension是动态的。。。。意味着…一些图像将具有.jpg,其他图像将具有.png或其他。。。那我怎么处理呢that@Alex,接受。。。Yif扩展是动态的吗???太好了,谢谢!我能想到的唯一能让你的答案变得更好的事情是对正则表达式工作原理的分解,但显然这取决于你。@GrumpyCrouton better?
$string = "catalog/reviews/249532-20691-5369.jpg";

preg_match('(\d{6}-\d{5}-\d{4})', $string, $result);
echo $result[0];
249532-20691-5369