Php file_get_contents и &
Я пытаюсь использовать php file_get_content ('url');
Дело в том, что url имеет '&' в нем, например
file_get_contents('http://www.google.com/?var1=1&var2=2')
он автоматически отправляет запросы www.google.com/?var1=1&var2=2
Как я могу предотвратить это?
Ответы
Ответ 1
Я согласен с оригинальным плакатом вопроса. Чтобы быть очень конкретным:
http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=301+E.+Linwood+Avenue++Turlock%2C+CA
Для этого необходимо передать передатчик sensor = false, или запрос вернет результаты 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
Ответ 2
Вам следует попробовать посмотреть библиотеки 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.
Ответ 3
Попробуйте заменить простую цитату '
для двойной кавычки "
:
file_get_contents("http://www.google.com/?var1=1&var2=2")
кажется странным, но работает!
Ответ 4
Похоже, у вас на самом деле есть строка с "& amp;". Вы, вероятно, не видите этого, потому что вы просто показываете вывод в браузере. Вы должны использовать представление источника браузера, чтобы отображать элементы html.
Ответ 5
Проблема, скорее всего, является частью вашего PHP-кода. Я подозреваю, что то, что, по вашему мнению, происходит, на самом деле не происходит.
Я подозреваю, что вместо кода, который вы опубликовали, вы, вероятно, захватываете часть этого URL-адреса из переменной, например:
$data = file_get_contents("http://example.com/?$myvariable");
Повторение этой переменной в браузере может скрывать тот факт, что вы случайно запрограммировали специальные символы на предыдущем шаге, потому что в браузере "& amp;" будет выглядеть как "&".
Также возможно, что ваш запрос file_get_contents() работает правильно, и то, что, по вашему мнению, является проблемой при кодировании и знаке, может быть проблемой в другом месте - публикация фактического исходного кода может помочь определить проблему.
Ответ 6
попробуйте эту конфигурацию в php.ini
allow_url_fopen = On
если используется https url, необходимо config
extension=php_openssl.dll
Ответ 7
На самом деле, нет ничего плохого в использовании &
в качестве разделителя полей в строке запроса. Это отлично valid и даже рекомендуется w3c. Проблема с использованием &
заключается в том, что он взаимодействует с ссылками на объекты символов (который имеет форму &xxx;
).
Также см. примечание в руководстве по PHP для функция url_encode():
Будьте осторожны с переменными, которые может соответствовать объектам HTML. Вещи как & amp, & copy и & фунт обрабатываются посредством браузер и фактический объект вместо требуемой переменной имя. Это очевидная проблема, которая W3C рассказывал людям о годами. PHP поддерживает изменение аргумента разделитель к предложенному W3C через двоеточие через arg_separator.ini. К сожалению, большинство пользовательские агенты не отправляют данные формы в этот разделительный формат с двумя двоеточиями. более переносимым способом это используйте &
вместо &
как сепаратор.
Если вам действительно не нравится &
в ваших URL-адресах, я бы предложил проверить настройку arg_separator в ваш файл php.ini, хотя я не уверен на 100%, это влияет на способ изменения URL-адресов file_get_contents