Я пытаюсь использовать php's file_get_content ('url');
Дело в том, что у него в нем есть «&», например
file_get_contents('http://www.google.com/?var1=1&var2=2')
он автоматически делает запросы на www.google.com/?var1=1&var2=2
Как я могу предотвратить это?
Я согласен с оригинальным плакатом вопроса. Чтобы быть очень конкретным:
Для этого требуется передать датчик = ложная переменная, или запрос вернет результаты 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&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
На самом деле, нет ничего плохого в использовании &
как разделитель полей в строке запроса. Это абсолютно корректно и даже рекомендуется w3c . Проблема с использованием &
заключается в том, что она взаимодействует с ссылками на сущности символов (которая имеет форму &xxx;
).
Также см. Примечание в руководстве PHP для функции url_encode () :
Будьте осторожны с переменными, которые могут соответствовать объектам HTML. Такие вещи, как & amp, & copy и & фунт, анализируются браузером, и вместо имени требуемой переменной используется фактическая сущность. Это очевидная проблема, о которой W3C рассказывал людям много лет. PHP поддерживает изменение разделителя аргументов в W3C-предложенную полуточку через директиву arg_separator .ini. К сожалению, большинство пользовательских агентов не отправляют данные формы в этом формате с разделителями с запятой. Более портативный способ заключается в использовании
&
вместо&
в качестве разделителя.
Если вам действительно не нравится &
в ваших URL-адресах, я бы предложил проверить настройку директивы arg_separator в файле php.ini, хотя я не уверен на 100%, что это влияет на то, как file_get_contents изменяет URL-адреса