You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP去除字符串数字:邮箱+后数字清理问题求助

让我来帮你找出问题所在,顺便给你几个更简洁的解决方案~

问题出在哪里?

你的delete_all_between函数在计算要删除的文本范围时,错误地把结束符@也包含进去了。看这段关键代码:

$textToDelete = substr($string, $beginningPos, ($endPos + strlen($end)) - $beginningPos);

当$end是@时,strlen($end)等于1,所以$endPos + strlen($end)会指向@的下一个位置。拿你的例子jaymin+1@gmail.com来说,这段代码会把+1@整个截取出来并替换为空,最终原字符串就变成了jaymingmail.com——这就是为什么你得到了错误的结果,因为@被一起删掉了!

另外,你的递归逻辑其实是多余的,符合规范的邮箱地址里只会有一个@,且@前的+也只会出现一次,完全不需要递归处理。

修复你的原函数

如果一定要沿用你的函数逻辑,只需要调整要删除的文本范围,不要包含结束符@:

public function delete_all_between($beginning, $end, $string) {
    $beginningPos = strpos($string, $beginning);
    $endPos = strpos($string, $end);
    // 增加判断:如果beginning在end之后,直接返回原字符串
    if ($beginningPos === false || $endPos === false || $beginningPos >= $endPos) {
        return $string;
    }
    // 只删除从beginning到end之前的部分,不包含end本身
    $textToDelete = substr($string, $beginningPos, $endPos - $beginningPos);
    return str_replace($textToDelete, '', $string);
}

这样调用$out = $this->delete_all_between('+', '@', $email);就能得到正确的jaymin@gmail.com了。

更简洁的方案:正则表达式

处理这种特定的字符串替换,用正则会更直接高效,完全不需要写复杂的函数。你可以精准匹配+后面的任意数字(直到@之前),然后替换掉这部分内容:

$email = "jaymin+1@gmail.com";
// 匹配@前的"+数字"组合,替换为空
$cleanedEmail = preg_replace('/\+\d+(?=@)/', '', $email);
echo $cleanedEmail; // 输出 jaymin@gmail.com

解释一下这个正则的含义:

  • \+:匹配+字符(需要转义,因为+在正则里是特殊字符)
  • \d+:匹配一个或多个连续数字
  • (?=@):正向预查,确保这串数字后面紧跟@,避免误处理其他位置的+(虽然规范邮箱里不会有这种情况)

如果你的需求是移除+到@之间的所有内容(而不只是数字),可以把正则改成/\+.*?(?=@)/,不过按照你的描述,用\d+就完全够用了。

内容的提问来源于stack exchange,提问作者Bits Please

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:34