Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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&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

Ответ 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

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

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

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

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