例如,如果我想从表达式的末尾删除重复的数字后缀,如下所示:
some_text_here_1
或者像这样:
some_text_here_1_5
我希望最终得到这样的东西:
some_text_here
什么是最好和最灵活的解决方案?
答案 0 :(得分:3)
$newString = preg_replace("/_?\d+$/","",$oldString);
正在使用正则表达式匹配可选的下划线(_?
)后跟一个或多个数字(\d+
),但前提是它们是字符串中的最后一个字符($
)并用空字符串替换它们。
要捕获无限_数字,只需将整个正则表达式($
除外)包装在捕获组中,然后在其后面添加+
:
$newString = preg_replace("/(_?\d+)+$/","",$oldString);
如果您只想删除下划线后面的数字后缀(例如,您希望some_text_here14不被更改,但some_text_here_14要更改),那么它应该是:
$newString = preg_replace("/(_\d+)+$/","",$oldString);
答案 1 :(得分:1)
更新以修复多个后缀
Strrpos在这样一个简单的字符串问题上要比正则表达式好得多。
$str = "some_text_here_13_15";
While(is_numeric(substr($str, strrpos($str, "_")+1))){
$str = substr($str,0 , strrpos($str, "_"));
}
Echo $str;
Strrpos找到最后一个" _"在str中,如果它的数字将其删除。
https://3v4l.org/OTdb9
只是为了让你知道我的意思是正则表达式不是一个很好的解决方案就是性能。
正则表达式:
https://3v4l.org/Tu8o2/perf#output
100次运行0.027秒。
我的代码添加了数字检查:
https://3v4l.org/dkAqA/perf#output
100次运行0.003秒
这个新代码的表现比奇怪的要好得多,正则表达式非常慢。相信我
你是什么是最好的判断。
答案 2 :(得分:1)
首先,您要使用正则表达式preg_replace()
删除所有数字/\d+/
。然后,您还希望使用rtrim()
修剪右侧的任何下划线,并提供_
作为第二个参数。
我在以下示例中将两者合并:
$string = "some_text_here_1";
echo rtrim(preg_replace('/\d+/', '', $string), '_'); // some_text_here
我也在3v4l here创建了一个例子。
希望这有帮助! :)
答案 3 :(得分:1)
$reg = '#_\d+$#';
$replace = '';
echo preg_replace($reg, $replace, $string);
这样做
abc_def_ghi_123 > abc_def_ghi
abc_def_1 > abc_def
abc_def_ghi > abc_def_ghi
abd_def_ > abc_def_
abc_123_def > abd_123_def
如果是abd_def_123_345> abc_def 一个人可以改变这条线
$reg = '#(?:_\d+)+$#';