Php 我该如何解决这个问题?美元中的符号

Php 我该如何解决这个问题?美元中的符号,php,get,special-characters,urlencode,Php,Get,Special Characters,Urlencode,对于我的电子邮件确认脚本,我通过现有的单向加密功能运行用户的电子邮件地址,然后从中间提取20个字符,从而生成一个令牌。我从用户那里获取令牌作为$\u get变量或$\u POST变量。我遇到了一个“bug”,当输入一个带有加号(+)的电子邮件地址,然后该令牌作为$\u GET变量从用户处检索回来时,加号被转换为一个空格,哈希值发生变化,因此令牌不再匹配 所以,我想知道解决这个问题的最佳方法是什么?避开加号?转换加号?URL编码吗?当我使用$\u GET时,还有哪些字符会发生这种情况 以下是相关代

对于我的电子邮件确认脚本,我通过现有的单向加密功能运行用户的电子邮件地址,然后从中间提取20个字符,从而生成一个令牌。我从用户那里获取令牌作为$\u get变量或$\u POST变量。我遇到了一个“bug”,当输入一个带有加号(+)的电子邮件地址,然后该令牌作为$\u GET变量从用户处检索回来时,加号被转换为一个空格,哈希值发生变化,因此令牌不再匹配

所以,我想知道解决这个问题的最佳方法是什么?避开加号?转换加号?URL编码吗?当我使用$\u GET时,还有哪些字符会发生这种情况

以下是相关代码,以防有所帮助:

<?php
if (isset ($_GET['email'], $_GET['token'])) {
    $email = strtolower (mysql_real_escape_string($_GET['email']));
    $token = mysql_real_escape_string($_GET['token']);
    $correctToken = substr (doEncrypt ($email), -26, -6);
}elseif (isset ($_POST['submit'])) {
    $email = strtolower (mysql_real_escape_string($_POST['email']));
    $token = mysql_real_escape_string($_POST['token']);
    $correctToken = substr (doEncrypt ($email), -26, -6);
}

if (isset ($email, $token, $correctToken)){    
    if ($token == $correctToken) {
        // Confirm user's email!
    }
}
?>

如果是我,我会在散列之前执行
str_replace()
将加号转换为空格。将
str_replace()
放在散列函数中;这样,用户的电子邮件地址只在函数的作用域内修改,在脚本的其余部分保持不变

function hash_email($email)
{
  $email = str_replace('+', ' ', $email);

  ...hashing stuff happens here...

  return $token;
}

$token = hash_email($_GET['email']);

是的,这将是最合适的(在你发送每个电子邮件的url之前)。可能重复的唯一问题是,我将不得不在几个地方这样做,然后还担心在某些时候为用户使用不正确的电子邮件。在计算正确的标记之前,如何将空格转换为加号?我可以在
if(isset($\u GET['email'])
部分中这样做吗?请参阅我的编辑。感谢@njbair的回复!