JSON Ampersand转换导致错误

时间:2012-11-05 00:14:20

标签: php geocode ampersand

当我尝试解析我的地理编码链接时,由于放大器而出现错误;声明。在我“json_decode”字符串之前,我有一个名为www.something.com/something?bla=bla&sensor=true的链接,但是当我将它作为参数发送到函数时它的&字符正在转换为&。像

这样的链接
http://maps.googleapis.com/maps/api/geocode/json?address=Bekirdere,%20%C4%B0zmir&sensor=true 

工作正常,但链接如

http://maps.googleapis.com/maps/api/geocode/json?address=Bekkirdere,%20%C4%B0zmit&sensor=true 

没有给出任何结果。 (&转换为&

如何阻止它转换?

我的解析器功能:

function get_url_contents($url) 
{
    $url = str_replace(' ', '%20', $url); 
    $crl = curl_init();
    $timeout = 5;
    curl_setopt ($crl, CURLOPT_URL,$url);
    curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
    $ret = curl_exec($crl);
    curl_close($crl);
    return $ret;
}

function __construct($url)
{
    $json = $this->get_url_contents($url);
    $this->_jsonArray = json_decode($json, true);
}

1 个答案:

答案 0 :(得分:0)

PHP urlencode()函数比执行str_replace更好,你应该只编码那些GET值的URL部分;你不应该对整个URL进行编码,因为正如你所指出的,这也会编码将变量彼此分开的&符号。

您需要构建如下所示的URL:

$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=';
$url .= urlencode('Bekirdere, Izmir');
$url .= '&sensor=true';

然后按上述方式进行curl来电。

我已经测试了下面的测试脚本,它可以工作:

$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=';
$url .= urlencode('Bekirdere, Izmir');
$url .= '&sensor=true';

$crl = curl_init();
$timeout = 5;
curl_setopt ($crl, CURLOPT_URL,$url);
curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
$ret = curl_exec($crl);
curl_close($crl);

$returned_data = json_decode($ret, true);
var_dump($returned_data);

您需要将其放入您的代码结构中,或者重构您的类以接收$address参数(例如“Izmir,Turkey”),而不是完整的URL(就像现在一样)。这样,您就可以在构建完整的URL之前转义地址部分以传递给curl