PHP模拟实现内置ltrim函数的代码存在两个问题如何修正?
PHP自定义ltrim函数修正方案
针对你代码存在的两个问题,核心修正逻辑有两点:
- 调整遍历终止规则:仅从字符串起始位置逐字符校验,一旦遇到第一个不在待修剪字符集合内的字符,立刻停止遍历,完全不会触碰字符串中后段的内容,符合ltrim仅修剪开头的规则
- 调整字符移除逻辑:不再将匹配字符替换为空格,而是记录开头连续匹配到的待修剪字符长度,最终通过字符串截取直接返回剩余非匹配内容,保证返回结果长度正确
修正后的可运行代码如下,同时兼容内置ltrim未传第二个参数时默认修剪开头空白的行为:
function leftTrim(string $Sstr, ?string $char = null): string { // 未传入待修剪字符时,默认匹配标准空白字符,对齐内置ltrim默认行为 if ($char === null) { $char = " \t\n\r\0\x0B"; } $strLength = strlen($Sstr); $matchOffset = 0; // 仅从字符串开头开始遍历匹配 for (; $matchOffset < $strLength; $matchOffset++) { $isMatch = false; // 校验当前位置字符是否属于待修剪字符 for ($j = 0; $j < strlen($char); $j++) { if ($Sstr[$matchOffset] === $char[$j]) { $isMatch = true; break; } } // 遇到第一个非待修剪字符,直接终止循环,不再往后遍历 if (!$isMatch) { break; } } // 从第一个非待修剪字符位置截取子串返回 return substr($Sstr, $matchOffset); }
简单测试验证:
- 调用
leftTrim(" hello world ", " "),返回结果为hello world,仅删除开头空格,末尾空格保留 - 调用
leftTrim("***test***content", "*"),返回结果为test***content,仅删除开头星号,中间、末尾星号不受影响
内容的提问来源于stack exchange,提问作者MBK901
相关产品推荐
相关产品推荐

