网址不会自动解码$ _GET

问题描述:

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

所以,如果我调用$ _GET [“电子邮件”]中显示的值是有人%40example.com而应该是[email protected]

我理解$ _ 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']; 
} 
+1

的不是[验证方式](http://*.com/questions/12026842/how-to-validate-an-email-地址中的PHP/12026863#12026863)emailaddresses,因为:https://emailtester.pieterhordijk.com/test-pattern/Nzc – PeeHaa 2014-08-29 14:01:47

+1

我从@PeeHaa评论表示赞同我会强烈建议使用'filter_var($ _ GET ['电子邮件'],FILTER_VALIDATE_EMAIL)' – 2014-08-29 14:03:56

+1

你正在处理输入表单吗?你是否在使用'multipart/form-data'内容类型?您需要'application/x-www-form-urlencoded'内容类型来向PHP发送内容需要解码的信号。 – 2014-08-29 14:07:37

ü需要把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']); 
} 

而且,这不是验证电子邮件

的正确方法
+0

@PeeHaa ...不能给我urldecode方法的分?总是需要找借口downvote别人 – Saswat 2014-08-29 14:19:23

+0

我真的不应该做出反应的人抱怨downvotes,但对于什么是值得我删除我的downvote你删除的那一刻关于有道破声明。所以... – PeeHaa 2014-08-29 14:49:32

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

其他一些指针:

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

  • 您应该考虑使用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 
}