现在是少女时代,以后是少女时代,永远是少女时代!
sone :少时的假粉丝

PHP 删除开头指定字符串、即ltrim函数的使用和替代ltrim函数封装了一个方法



咋天项目短信验证码报错,由ltrim函数引起的bug,很简单,却没有注意到,导致短信手机号码,发送不出去。

1、需求:

因为数据库里面存储的号码,有 84开头的手机号码,也有不是84开头的号码,因为短信接口的要求,如果手机号码没有84,需要加上84抬头。

2、原代码 - 使用ltrim函数左删除规定的字符串

$mobile = '84'.ltrim($mobile,'84');

3、PHP ltrim 语法:

(PHP 4, PHP 5, PHP 7)
ltrim — 删除字符串开头的空白字符(或其他字符)

ltrim ( string $str [, string $character_mask ] ) : string

删除字符串开头的空白字符(或其他字符)
参数

str

输入的字符串。

character_mask

通过参数 character_mask,你也可以指定想要删除的字符,简单地列出你想要删除的所有字符即可。使用..,可以指定字符的范围。

返回值
该函数返回一个删除了 str 最左边的空白字符的字符串。 如果不使用第二个参数, ltrim() 仅删除以下字符:

" " (ASCII 32 (0x20)),普通空白字符。
"\t" (ASCII 9 (0x09)), 制表符.
"\n" (ASCII 10 (0x0A)),换行符。
"\r" (ASCII 13 (0x0D)),回车符。
"\0" (ASCII 0 (0x00)), NUL空字节符。
"\x0B" (ASCII 11 (0x0B)),垂直制表符。

4、代码审查

看原代码、和PHP函数说明

$mobile = '84'.ltrim($mobile,'84');

应该没有问题的啦
然而,实际情况却是,如果手机号码字符串,以8开头,注意不是84开头,也会把8给干掉!!!!

5、bug修复 - 封装一个函数,用来替代ltrim函数

知道问题后,封装一个函数,用来替代ltrim函数

/**
 * @description 判断字符串 前面是否有 符合的 要删除的字符串 有 则删除 否 直接返回 | 只删除 一次
 * @author Holyrisk
 * @date 2020/12/4 21:14
 * @param $string 原字符串
 * @param $deleteString 要删除的字符串
 * @return bool|string
 */
function deleteString($string,$deleteString)
{
    //去除 左右空格 先
    $string = trim($string);
    //长度去匹配
    $length = strlen($deleteString);
    //截取
    $interceptTemp = substr($string,0,$length);
    if($interceptTemp == $deleteString) {
        $string =  substr($string,$length);
    }
    return $string;
}

代码调用:

$mobile = '84'.deleteString($mobile,'84');

测试 
输入  84812133

输出  812133

没有问题

OK

琼ICP备16001221号-1