2012-07-16 68 views
0

我在我的网址这个网址查询参数解析,最好的选择

http://www.test.com/[email protected]&tid=RetEm_Welcome_resp_05232012 

问题ISN,它不是

http://www.test.com/?email = [email protected]&tid=RetEm_Welcome_resp_05232012 

notice email = [email protected] 

,所以我不能做$_GET['email'] 我如何能得到的电子邮件从上面的字符串地址?

+1

如果您无法控制这些来电,但如果您知道电子邮件将始终是第一部分,您可能需要考虑使用mod-rewrite来捕获该电子邮件地址并为其提供内部使用的专用名称。 – 2012-07-16 20:29:17

回答

2

给出的两个示例都不适用于所需的$_GET['email']

第一个示例http://www.test.com/[email protected]&tid=RetEm_Welcome_resp_05232012对于电子邮件地址没有“密钥”,因此获取它的唯一方法是迭代每个查询字符串参数,并假定无密钥值是电子邮件地址或者对其进行正则表达式匹配。东西(非常)基本是:

$email = ''; 
foreach ($_GET as $key => $val) { 
    if (strpos($key, '@') && ($val == '')) { 
     // assume this is an email address 
     $email = $key; 
     break; 
    } 
} 

第二个例子,http://www.test.com/?email = [email protected]&tid=RetEm_Welcome_resp_05232012,在名称中的“电子邮件”罪状后的空间。 $email = $_GET['email '];

是否有一个具体原因经常?email=[email address]查询字符串将无法正常工作:它可以与检索?

0

您可以通过

$query=$_SERVER['REQUEST_URI']; 

获得请求的URI的字符串之后,你想

1

你可以解析这个查询答案很明显,这是foreach超过$_GET,并期待在一个电子邮件地址键。 但是这不起作用,因为PHP会将电子邮件地址(以及其他可能的字符)中的.转换为_字符,以便与register_globals向后兼容。这使得任务有点难度, 但不是不可能的:

就一直在玩它,实际上它不可能的,因为PHP实际消耗的电子邮件地址.,并将其转换为_连当您从$_SERVER['QUERY_STRING']获得原始查询字符串时。抱歉。

它可能会与POST请求,因为我不认为PHP会修改可以从php://input获得的数据 - 但如果你可以修改这个,你可能会修改请求的URL,以便它有一个适当的关键,这不会是一个问题。

+0

没有'='所以这一行'explode('=',$ val,2);'失败 – Constantin 2012-07-16 20:40:19

+0

不,它会返回第一部分并填充键。它失败的原因(这是我的坏)是因为它应该是'list($ key,$ val)= explode('=',$ data,2);' – DaveRandom 2012-07-16 20:42:54

+1

*但它仍然不起作用,因为即使从$ _SERVER ['QUERY_STRING']获得原始查询,PHP仍然在电子邮件地址中使用'.'。所以简短的回答是 - 它不能完成。 – DaveRandom 2012-07-16 20:44:13