网址不会自动解码$ _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'];
}
答
ü需要把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']);
}
而且,这不是验证电子邮件
的正确方法
答
检查您发送的内容类型标题。如果您要提交表单,那么我应该在表单中使用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
}
的不是[验证方式](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
我从@PeeHaa评论表示赞同我会强烈建议使用'filter_var($ _ GET ['电子邮件'],FILTER_VALIDATE_EMAIL)' – 2014-08-29 14:03:56
你正在处理输入表单吗?你是否在使用'multipart/form-data'内容类型?您需要'application/x-www-form-urlencoded'内容类型来向PHP发送内容需要解码的信号。 – 2014-08-29 14:07:37