php file_get_contents и & amp;

Я пытаюсь использовать php's file_get_content ('url');

Дело в том, что у него в нем есть «&», например

file_get_contents('http://www.google.com/?var1=1&var2=2')

он автоматически делает запросы на www.google.com/?var1=1&var2=2

Как я могу предотвратить это?

Я согласен с оригинальным плакатом вопроса. Чтобы быть очень конкретным:

http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=301+E.+Linwood+Avenue++Turlock%2C+CA

Для этого требуется передать датчик = ложная переменная, или запрос вернет результаты BAD из Google. Если передать этот STRING через file_get_contents, он (PHP file_get_contents) заменяет «&» на "&" поэтому Google не любит меня:

 Array ( [type] => 2 [message] => file_get_contents(http://maps.googleapis.com/maps/api/geocode/json?address=301 E. Linwood Avenue Turlock, CA&amp;sensor=false) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request ) 

Итак, это решение, с которым я столкнулся, используя http_build_query

 $myURL = 'http://maps.googleapis.com/maps/api/geocode/json?'; $options = array("address"=>$myAddress,"sensor"=>"false"); $myURL .= http_build_query($options,'','&'); $myData = file_get_contents($myURL) or die(print_r(error_get_last())); 

Я также включаю код (спасибо Marco K.) Я нашел на веб-сайте PHP для использования пользовательской функции для PHP <5:

 if (!function_exists('http_build_query')) { function http_build_query($data, $prefix='', $sep='', $key='') { $ret = array(); foreach ((array)$data as $k => $v) { if (is_int($k) && $prefix != null) { $k = urlencode($prefix . $k); } if ((!empty($key)) || ($key === 0)) $k = $key.'['.urlencode($k).']'; if (is_array($v) || is_object($v)) { array_push($ret, http_build_query($v, '', $sep, $k)); } else { array_push($ret, $k.'='.urlencode($v)); } } if (empty($sep)) $sep = ini_get('arg_separator.output'); return implode($sep, $ret); }// http_build_query }//if 

Вы должны попробовать посмотреть библиотеки CURL в PHP, которые позволят вам сделать что-то вроде:

 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://mysite.com/file.php?blah=yar&test=blah"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); curl_close($ch); 

Затем вы можете получить результаты из $ data.

Попробуйте заменить простую цитату ' для двойной цитаты " :

file_get_contents("http://www.google.com/?var1=1&var2=2")

это кажется странным, но работает!

Похоже, у вас на самом деле есть строка с «& amp;». Вы, вероятно, не видите этого, потому что вы просто показываете вывод в браузере. Вы должны использовать представление источника браузеров, чтобы отобразить элементы html.

Проблема, скорее всего, является частью вашего PHP-кода. Я подозреваю, что то, что вы думаете, происходит не на самом деле.

Я подозреваю, что вместо кода, который вы опубликовали, вы, вероятно, захватываете часть этого URL-адреса из переменной, например:

 $data = file_get_contents("http://example.com/?$myvariable"); 

Повторение этой переменной в браузере может скрывать тот факт, что вы случайно запрограммировали специальные символы на предыдущем шаге, потому что в браузере «& amp;» будет выглядеть как «&».

Также возможно, что ваш запрос file_get_contents () работает правильно, и то, что вы считаете проблемой с кодировкой & sign, может быть проблемой где-то еще – публикация фактического исходного кода может помочь определить проблему.

попробуйте эту конфигурацию в php.ini

 allow_url_fopen = On 

если используется https url, необходимо настроить

 extension=php_openssl.dll 

На самом деле, нет ничего плохого в использовании &amp; как разделитель полей в строке запроса. Это абсолютно корректно и даже рекомендуется w3c . Проблема с использованием & заключается в том, что она взаимодействует с ссылками на сущности символов (которая имеет форму &xxx; ).

Также см. Примечание в руководстве PHP для функции url_encode () :

Будьте осторожны с переменными, которые могут соответствовать объектам HTML. Такие вещи, как & amp, & copy и & фунт, анализируются браузером, и вместо имени требуемой переменной используется фактическая сущность. Это очевидная проблема, о которой W3C рассказывал людям много лет. PHP поддерживает изменение разделителя аргументов в W3C-предложенную полуточку через директиву arg_separator .ini. К сожалению, большинство пользовательских агентов не отправляют данные формы в этом формате с разделителями с запятой. Более портативный способ заключается в использовании &amp; вместо & в качестве разделителя.

Если вам действительно не нравится &amp; в ваших URL-адресах, я бы предложил проверить настройку директивы arg_separator в файле php.ini, хотя я не уверен на 100%, что это влияет на то, как file_get_contents изменяет URL-адреса