2010-04-17 21 views
22

Estoy tratando de usar php's file_get_content ('a url');php file_get_contents y &

La cosa es que si el URL tiene '&' en ella, por ejemplo

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

se hacen automáticamente una solicitud a www.google.com/?var1=1&var2=2

¿Cómo puedo evitar que esto ocurra?

+0

Podría mostrar un poco más de código alrededor del 'file_get_content()' línea, sospecho que la error puede estar en una línea anterior. – gnarf

+0

Esto me está pasando a mí también! ¿Es esto un cronjob en godaddy por casualidad? –

+0

sucede lo mismo conmigo, de 3 urls solo uno produce & así que no hay manera de decir usar curl, quiero solución dentro de esta función. file_get_contents() .. gracias – MFarooqi

Respuesta

2

Debe intente buscar en las bibliotecas CURL en PHP que le permitirían hacer algo como:

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

entonces se puede obtener a partir de los resultados $ datos.

+0

¿Por qué usar cURL (que el usuario puede no haber instalado en su instalación de PHP, ya que es una extensión adicional) si file_get_contents debería funcionar correctamente? En este caso, parece que sucede algo extraño con la codificación de URL. –

+1

cURL es una extensión bastante común ... y está específicamente diseñada para solicitudes de URL. File_get_contents no está "diseñado" para URL. –

+1

No estoy de acuerdo con que file_get_contents no se haya diseñado para las URL. Consulte el manual de la función en www.php.net y verá que el primer ejemplo realmente demuestra la lectura de un archivo a través de HTTP. Pero acepto que su propósito finaliza con las solicitudes GET más simples. No se admite nada más complejo (POST, manipulación de encabezados, carga de archivos, etc.). Sin embargo, no recomendaría usar cURL ya que es una extensión bastante antigua. En cambio, ¿qué hay de buscar en Zend_Http, que es parte de Zend Framework y es totalmente OO: http://framework.zend.com/manual/en/zend.http.client.html – Janci

0

Parece que de hecho tiene una cadena con "& amp;". Probablemente no pueda verlo porque solo muestra el resultado en el navegador. Debe usar la vista de origen de los navegadores para que los elementos html sean visibles.

0

El problema probablemente sea parte de su código PHP. Sospecho que lo que crees que está sucediendo no está realmente sucediendo.

sospecho que más que el código que envió, es probable que esté agarrando parte de esa URL de una variable, como por ejemplo:

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

Haciéndose eco de esa variable en el navegador puede estar ocultando el hecho de que' he codificado caracteres especiales inadvertidamente en un paso anterior, porque en el navegador un "& amp;" se verá como "&".

También es posible que su solicitud file_get_contents() funcione correctamente, y lo que crea que es un problema con la codificación del & puede ser un problema en otro lugar; publicar el código fuente real puede ayudar a determinar el problema.

-1

En realidad, no hay nada de malo en usar & como separador de campo en la cadena de consulta. Es perfectamente valid e incluso recommended by w3c. El problema con el uso de & es que interactúa con referencias de entidad de caracteres (que tiene el formato &xxx;).

También, ver la nota en el manual de PHP para url_encode() función:

tener cuidado con variables que puede coincidir con entidades HTML. Cosas como amplificador &, & copia y & libra se analizan por el navegador y la entidad real es utilizado en lugar del nombre de la variable deseada. Esta es una molestia obvia que el W3C ha estado diciendo a las personas acerca de durante años. PHP admite cambiar el argumento separador alsugerido por W3C mediante la directiva arg_separator .ini. Desafortunadamente, la mayoría de los agentes de usuario no envían datos de formulario en este formato separado por punto y coma.Una forma más portable de es use & en lugar de & como el separador .

Si realmente no le gusta la & en sus URL, sugeriría para comprobar la configuración de directiva arg_separator en su archivo php.ini, aunque no estoy 100% seguro de que influye en la manera cómo file_get_contents modifica las URL

+1

quien haya votado negativamente esto, ¿podría comentar sus inquietudes? – Janci

+2

El problema con esta publicación es que un ampersand está representado por & en HTML. Se usa solo en una cadena codificada en HTML, p. en pero * nunca * en una URL. –

8

Acepto el póster original de la pregunta. Para ser muy específico:

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

Esto requiere el sensor = false variable que se pasa, o la consulta devolverá los malos resultados de Google. Si paso esta cadena a través file_get_contents, que (PHP file_get_contents) sustituye a la "&" con "&" por lo que Google no me gustan:

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 
) 

Así que esta es la solución que se me ocurrió, utilizando 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())); 

también incluyo el código (gracias a Marco K.) que encontré en la PHP website utilizar una función personalizada para 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 
0

Intente sustituir simple cita ' de comillas dobles ":

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

Parece extraño, pero funciona!

+0

Esto funciona, pero ¿por qué? – Guillaume

+1

Esto no funciona si su cadena de consulta se establece con vars: $ var1 = 1; file_get_contents ("http://www.google.com/?var1=$var1&var2=2") hará que la cadena se convierta en html special char codificada. – dval

0

probar esta configuración en php.ini

allow_url_fopen = On 

si la URL https uso, debe config

extension=php_openssl.dll 
Cuestiones relacionadas