PHP urldecode()函数无法解码URL中邮箱地址问题求助
解决URL编码邮箱无法解码的问题
我之前也碰到过一模一样的坑,其实问题根源在于PHP已经自动帮你处理了URL解码!
为什么你的现有代码不生效?
当你通过$_GET['email']获取URL参数时,PHP会自动对URL里的编码字符进行解码——换句话说,$_GET['email']已经直接是some_email@gmail.com了,完全不需要再额外调用urldecode()或者rawurldecode()。
至于你看到%40始终没转成@,大概率是你的URL参数被二次编码了:原本的%40被转成了%2540(也就是%符号本身被编码成了%25),这时候一次解码只能得到%40,必须两次解码才能还原出@。
正确的处理方案
场景1:URL是正常单次编码(仅@被转为%40)
直接使用$_GET['email']即可,不需要额外解码:
$isValid = ! User::emailExists($_GET['email']);
场景2:URL被二次编码(%40变成了%2540)
如果确认是二次编码导致的问题,就需要连续调用两次解码:
$decodedEmail = urldecode(urldecode($_GET['email'])); $isValid = ! User::emailExists($decodedEmail);
快速验证方法
你可以先打印出$_GET['email']的原始值,判断到底是哪种情况:
var_dump($_GET['email']);
- 如果输出是
string(19) "some_email%40gmail.com",说明是二次编码问题; - 如果输出是
string(18) "some_email@gmail.com",那就是你多做了一次多余的解码操作。
内容的提问来源于stack exchange,提问作者Čendi
相关产品推荐
相关产品推荐

