删除下划线和随机数字后字符串的最后一部分

Remove the last part of a string after underscore and random digit

我的字符串看起来像

$img_name = "my_beautiful_picture_123456_789101112131415_16171819202122.jpg"

从第一个下划线后跟数字到末尾删除的最简单方法是什么?

我要输出

my_beautiful_picture

我试过了

$img_name = substr($img_name, 0, strpos($img_name, "_"));

$img_name = preg_replace('/_[0-9].*/', '', $img_name);

但是两者的结果都是 my,我对正则表达式不是很熟悉。

我们可以简单地使用一个简单的表达式 preg_replacepreg_matchpreg_match_all:

_[0-9].+

测试

$re = '/_[0-9].+/s';
$str = 'my_beautiful_picture_123456_789101112131415_16171819202122.jpg';
$subst = '';

$result = preg_replace($re, $subst, $str);

echo $result;

输出

my_beautiful_picture

DEMO

正则表达式电路

jex.im 可视化正则表达式:

根据我在您之前发布的 ideone link 中看到的代码,我知道可能发生了什么。如果你以前这样尝试过:

echo $img_name2 = "my_beautiful_picture_123456_789101112131415_16171819202122.jpg";
echo " | ";
echo $img_name2 = substr($img_name2, 0, strpos($img_name2, "_"));
echo " | ";
echo $img_name2 = preg_replace('/_[0-9].*/', '', $img_name2);

preg_replace 看起来像 的原因是之前的 substr 已经将 $img_name2 减少到 "my" 在你使用 preg_replace 之前。由于 "my" 没有任何下划线或数字,该正则表达式不匹配任何内容,因此没有任何内容被替换,您最终得到相同的 "my".