如何移除字符串前导零?使用preg_split丢失首个非零字符怎么解决
问题原因
你当前的写法出现问题的核心原因是 preg_split() 会把正则匹配到的内容作为分隔符直接丢弃:你写的正则 /[1-9]/ 匹配到了原字符串里第一个非零字符4,这个4被当成拆分用的分隔符删掉了,所以最终拿到的结果少了开头的这个4。
解决方法
这里给你三种可直接使用的方案:
方案1:修改preg_split的正则,用零宽断言避免吃掉匹配字符
把正则改成零宽正向预查的写法,只匹配「开头若干个0之后的位置」,不会实际消耗字符:
$str = "0044800 999999"; $res = preg_split("/^0*(?=[1-9])/", $str, 2)[1]; var_dump($res); // 输出 string(12) "44800 999999"
方案2:用preg_match直接匹配目标内容,逻辑更直观
直接匹配开头所有0之后的全部内容:
$str = "0044800 999999"; preg_match("/^0*(.*)/", $str, $matches); $res = $matches[1]; var_dump($res); // 输出 string(12) "44800 999999"
方案3:不用正则,直接用字符串函数移除左侧的0,性能更高
如果你的需求就是单纯去掉字符串开头所有的0,直接用ltrim()更简单高效:
$str = "0044800 999999"; $res = ltrim($str, '0'); var_dump($res); // 输出 string(12) "44800 999999"
边界情况说明:如果原字符串全部由0组成(如
000000),上述方案默认会返回空字符串,如果你需要保留至少一个0,可以补充判断逻辑:$res = ltrim($str, '0') ?: '0';
内容的提问来源于stack exchange,提问作者user627341
相关产品推荐
相关产品推荐

