【问题标题】:Explode String twice using PHP [duplicate]使用PHP分解字符串两次[重复]
【发布时间】:2026-02-03 01:45:01
【问题描述】:

我在 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 

有没有最好的方法在控制器中完成这项任务。

【问题讨论】:

  • 如果字符串始终采用这种形式,这是一种很好的方法。如果字符串不同,正则表达式可能是更好的选择,因为数字的长度始终相同。
  • 如果你真的想要,你可以使用正则表达式,但如果你有什么适合你,何必担心。
  • 是的...总是一样的长度...
  • @JonStirling,我对正则表达式不太熟悉
  • @MuhammadHashirAnwaar 然后坚持你所知道的?

标签: php explode


【解决方案1】:

https://ideone.com/XGwrTc

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

如果您有不同的文件扩展名,另一种选择:

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

【讨论】:

  • 非常简单!
  • 但这仍然包含 .jpg 文件扩展名
  • @Philipp 检查已更新
  • 如果扩展是动态的怎么办......意味着......有些图像会有.jpg,其他图像会有.png,否则......那我该如何处理
  • @Alex , 接受... (Y)
【解决方案2】:

在你的情况下,你可以使用一个简单的正则表达式。

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

在 php 中会是这样的

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

如果你需要任何扩展,你可以使用它

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

那么这是如何工作的:

我们从右边开始,所以我们在以$ 结尾的行添加一个锚点。从那里开始,我们想要扩展,这几乎是所有期望点[^\.]+。剩下的是文件名,它是从点到斜线[^\/]+ 的所有内容。这部分也包含在一个捕获组() 中,最后使用$m[1] 访问它。

【讨论】:

  • 太好了,谢谢!我能想到的唯一能让你的答案变得更好的是正则表达式如何工作的细分,但显然这取决于你。
  • @GrumpyCrouton 更好?
【解决方案3】:

explode返回一个数组,所以需要访问第一个元素:

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

echo $id2[0];

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

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

【讨论】:

  • 如果扩展是动态的那么???
【解决方案4】:

你可以使用正则表达式

这种模式会起作用:

(\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

【讨论】: