php file_get_contents и & - PullRequest
       32

php file_get_contents и &

23 голосов
/ 17 апреля 2010

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

Дело в том, что в url есть '&', например

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

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

Как мне предотвратить это?

Ответы [ 7 ]

8 голосов
/ 19 февраля 2011

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

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()));

Я также включил код (спасибо Марко К.), который я нашел на сайте PHP , чтобы использовать пользовательскую функцию для PHP <5: </p>

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 голосов
/ 19 апреля 2010

Вы должны попробовать посмотреть библиотеки 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.

1 голос
/ 19 августа 2013

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

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

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

0 голосов
/ 28 декабря 2016

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

allow_url_fopen = On

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

extension=php_openssl.dll
0 голосов
/ 21 апреля 2010

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

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

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

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

0 голосов
/ 20 апреля 2010

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

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

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

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

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

0 голосов
/ 19 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...