web-dev-qa-db-ja.com

CURL応答からHTTPヘッダーを削除する方法は?

プレーンテキストだけを返すphpスクリプトがありますwithout any html。次に、そのスクリプトに対してcURLリクエストを行いたいと思います。次のレスポンスを受け取ります。

HTTP/1.1 200 OK
Date: Mon, 28 Feb 2011 14:21:51 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.2.12-nmm2
Vary: Accept-Encoding
Content-Length: 6
Content-Type: text/html

6.8320

実際の応答は、htmlのないテキストとして6.832だけです。ヘッダー情報を削除するだけで、上記の応答から取得したいです。

すでにスクリプトを少し縮小しました。

$url = $_GET['url'];

if ( !$url ) {

  // Passed url not specified.
  $contents = 'ERROR: url not specified';
  $status = array( 'http_code' => 'ERROR' );

} else if ( !preg_match( $valid_url_regex, $url ) ) {

  // Passed url doesn't match $valid_url_regex.
  $contents = 'ERROR: invalid url';
  $status = array( 'http_code' => 'ERROR' );

} else {
  $ch = curl_init( $url );

  if ( strtolower($_SERVER['REQUEST_METHOD']) == 'post' ) {
    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $_POST );
  }

  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
  curl_setopt( $ch, CURLOPT_HEADER, true );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

  curl_setopt( $ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT'] );

  list( $header, $contents ) = preg_split( '/([\r\n][\r\n])\\1/', curl_exec( $ch ), 2 );

  $status = curl_getinfo( $ch );

  curl_close( $ch );
}

// Split header text into an array.
$header_text = preg_split( '/[\r\n]+/', $header );

if ( true ) {
  if ( !$enable_native ) {
    $contents = 'ERROR: invalid mode';
    $status = array( 'http_code' => 'ERROR' );
  }

  // Propagate headers to response.
  foreach ( $header_text as $header ) {
    if ( preg_match( '/^(?:Content-Type|Content-Language|Set-Cookie):/i', $header ) ) {
      header( $header );
    }
  }
  print $contents;
}

応答からヘッダー情報を削除するために何を変更する必要があるか考えていますか?

50
Artjom Zabelin

CURLOPT_HEADERをfalseに。

77
Ewan Heming

Curl呼び出しの後にこれを行います。

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
48
Roeland Werring

他の人が必要になった場合に後で使用するためだけに。私は同じ状況にありましたが、コンテンツではなくヘッダーテキストを削除するだけです。ヘッダーで取得していた応答は次のとおりです(空白を含む)。

HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, must-revalidate
Content-Language: en
Content-Type: text/html
Date: Tue, 25 Feb 2014 20:59:29 GMT
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Pragma: no-cache
Server: nginx
Vary: Cookie, Accept-Language, Accept-Encoding
transfer-encoding: chunked
Connection: keep-alive

HTTPから開始し、空白でキープアライブするまで削除したかったのです。

$contents = preg_replace('/HTTP(.*)alive/s',"",$contents);

それは私のためにした。

4
Medalist

Falseの場合、CURLOPT_HEADERの値を0に更新します

curl_setopt($ch, CURLOPT_HEADER, 0);
3
Yaco Zaragoza

何らかの理由で、たとえばCookieを取得するためにcurl_setopt($ch, CURLOPT_HEADER, 1);を使用する必要がある場合、次の方法でうまくいきました。 100%信頼できるかどうかはわかりませんが、試してみる価値はあります

$foo = preg_replace('/HTTP(.*)html/s',"",$curlresult);
1
superjaz1

nuSoapを使用している場合、ヘッダー全体が必要な場合は、$nsoap->responseDataまたは$nsoap->responseを使用してヘッダーなしでデータにアクセスできます。

誰かがそれを必要とする場合に備えて。

1
Peon
$content = null;

$ch = curl_init();
$rs = curl_exec($ch);

if (CURLE_OK == curl_errno($ch)) {
  $content = substr($rs, curl_getinfo($ch, CURLINFO_HEADER_SIZE));
}

curl_close($ch);

echo $content;
1
NoSkill

誰かが既にカール応答をファイル(私のように)に保存しており、したがってsubstrを使用するヘッダーの大きさがわからない場合は、試してください:

$file = '/path/to/file/with/headers';
file_put_contents($file, preg_replace('~.*\r\n\r\n~s', '', file_get_contents($file)));
0
Petr Nagy