为何使用ltrim函数时,第二个参数含运算符会多删除一个字符?
为什么ltrim()在第二个参数含运算符时会多删一个字符?
这个问题本质是对ltrim()的工作逻辑理解有偏差啦,我给你一步步拆解清楚:
先搞懂ltrim()的核心规则
ltrim()的第二个参数不是要匹配的固定字符串,而是一个字符集合。它的工作流程是:从目标字符串的最左侧开始,逐个检查每个字符是否属于这个集合里的任意字符,只要是就删掉,直到碰到第一个不在集合里的字符才会停止。
拿你的例子具体分析
比如你执行ltrim('53-34567', '53-'):
- 第二个参数对应的字符集合是
{'5','3','-'} - 逐个遍历原字符串的字符:
- 第一个字符
5→ 在集合里,删掉 - 第二个字符
3→ 在集合里,删掉 - 第三个字符
-→ 在集合里,删掉 - 第四个字符
3→ 注意!这个3也在字符集合里,所以继续删掉 - 第五个字符
4→ 不在集合里,停止删除
- 第一个字符
- 最后剩下的就是
4567,这就是为什么结果不是你预期的34567。
另外两个例子ltrim('53+34567', '53+')和ltrim('53*34567', '53*')逻辑完全一致:第二个参数的集合包含+/*,而原字符串第四个字符是3(属于集合里的字符),所以会被一并删除,直到遇到4才终止。
怎么实现只删除开头固定的"53-"这类字符串?
如果你的需求是精准删除开头的53-/53+/53*,而不是删除所有左侧属于字符集合的字符,那可以用正则匹配替换,比如:
preg_replace('/^53-/', '', '53-34567'); // 结果是34567 preg_replace('/^53\+/', '', '53+34567'); // 注意+是正则特殊字符,需要转义 preg_replace('/^53\*/', '', '53*34567'); // *也是正则特殊字符,需要转义
内容的提问来源于stack exchange,提问作者sica07
相关产品推荐
相关产品推荐

