网址不会自动解码$ _GET

时间:2014-08-29 13:59:56

标签: php get urldecode

我有一些代码用preg_match检查2 $ _GET变量。它还在数据库中查找一个变量值。问题是,当我调用变量时,url编码的电子邮件地址和@符号被%40替换不会变回可读文本。

因此,如果我拨打$ _GET [' email'],则显示的值为%40example.com,而应为someone@example.com

我理解$ _GET变量会自动解码,但它对我不起作用。在此域上安装SSL时会出现此问题。它可能与此有关吗?

这是我的代码:

if (isset($_GET['Email']) && preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', $_GET['Email'])) {
  $Email = $_GET['Email'];
}

2 个答案:

答案 0 :(得分:-1)

你需要放urldecode()

$_GET variable doesnot get url decoded automatically. You have to do it manually.

做这样的事情

if (isset($_GET['Email']) && preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', urldecode($_GET['Email']))) 
{
  $Email = urldecode($_GET['Email']);
}

此外,这不是验证电子邮件的正确方法

答案 1 :(得分:-1)

检查您要发送的内容类型标题。如果您要提交表单,那么您应该在表单中使用application/x-www-form-urlencoded类型来告诉PHP数据是URL编码的并且应该自动解码。这是除非您提交文件上传,在这种情况下multipart/form-data是合适的,可能需要手动解码内容(使用urldecode()取决于实际发送方式。您可以检查$_SERVER['CONTENT_TYPE']帮助您以编程方式确定是否需要手动解码。

其他一些指示:

  • 你应该考虑在这里使用POST而不是GET,除非你的期望是这是一个可导航的页面/或端点绑定到那个电子邮件地址(即有人可以书签的东西)。想想GET操作是从查询字符串指定的位置读取内容,而POST则与发布与POSTed数据相​​关的特定操作有关。

  • 您应该考虑使用filter_var()filter_input()以及电子邮件验证过滤器而不是正则表达式。

建议的用法是:

$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL);
if(false === $email) {
    // validation failed
}
// or
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
if(is_null($email) {
    // key was not present in GET params
} else if (false === $email) {
    // validation failed
}