使用PHP两次爆炸String

时间:2018-12-18 13:41:00

标签: php explode

我在SO herehere上看到了两个类似的问题,但仍然停留在...

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

我正在使用以下方法:

$id1 = explode('/', $image['img_link']);
$id2 = explode('.', $id1[2]);
echo $id2;  //output 249532-20691-5369 

在控制器中是否有最佳方法来完成此任务。

4 个答案:

答案 0 :(得分:7)

https://ideone.com/XGwrTc

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

具有不同文件扩展名的替代方法:

echo pathinfo ( $image['img_link'] ,  PATHINFO_FILENAME );

答案 1 :(得分:1)

您可以使用简单的正则表达式。

([^\/]+)\.jpg$

在php中看起来像这样

preg_match('/([^\/]+)\.jpg$/', $image['img_link'], $m);
echo $m[1];

如果您需要任何扩展名,可以使用此

([^\/]+)\.[^\.]+$

这是如何工作的:

我们从右边开始,因此我们在行$的末尾添加了一个锚点。从那里开始,我们需要扩展,几乎所有扩展都期望指向[^\.]+。剩下的就是文件名,这是从点到到达斜杠[^\/]+的所有内容。该部分也被包含在捕获组()中,最后以$m[1]对其进行访问。

答案 2 :(得分:0)

explode返回一个数组,因此您需要访问第一个元素:

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

echo $id2[0];

或者,您可以只使用basename()而不是前一个explode()(假设您始终使用.jpg扩展名):

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

答案 3 :(得分:0)

您可以使用正则表达式

此模式将起作用:

(\d{6}-\d{5}-\d{4})

故障:

  • \d的意思是“任何数字”
  • {#}表示#个值的计数,当然还有数字之间的破折号。
  • 将整个内容括在括号中以捕获整个结果

代码:

$string = "catalog/reviews/249532-20691-5369.jpg";

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

输出:

249532-20691-5369