Question

Je suis une boucle à travers chaque ligne d'une série de cURL retourné en-têtes HTTP, en essayant de détecter le moment où l'on finit et où commence la suivante. Je sais que l'en-tête HTTP se termine par une ligne vide, mais ce caractère est utilisé pour représenter cette rupture de la ligne en php? Je l'ai essayé avec \n mais il ne semble pas fonctionner. Je pourrais certainement faire quelque chose de mal.

Quel personnage est utilisé pour représenter le saut de ligne utilisé pour mettre fin à un en-tête?

Voici mon code existant:

$redirect = '';
$regs = '';
foreach ($curl_response as $line)
{   
    if ($line != "\n")
    {   # line is not a linebreak, so we're still processing a header block

        if (preg_match("(HTTP/[0-9]\.[0-9] [0-9]{3} .*)",$line))
        {   # line is the status code
            # highlight the outputted line
            $output .= "<b style='background: yellow;'>$line</b>";
        }

        elseif (preg_match("/^Location: (.*)$/m",$line,$regs)) 
        {   # the line is a location header, so grab the location being redirected to
            # highlight the outputted line
            $output .= "<b style='background: purple; color: white;'>$line</b>";
            $redirect = $regs[1];
        }

        else 
        {   # some other header, record to output
            $output .= $line;
        }

    }

    else 
    {   # we've reached a line break, so we're getting to a new block of redirects
        $output .= "\nreached line break\n";
        if ($redirect != '')
        {   # if we recorded a redirect above, append it to output
            $output .= "\n\nRedirecting to $redirect\n\n";
            $redirect = '';
        }

    }   

}

echo $output;

Résolu - Il s'avère que \r est ce que je suis correspondant sur. Très étrange. Je ne sais pas si cela change par site, ou si elle est quelque chose à mettre en boucle. Jusqu'à présent, son \r sur tous les sites que je l'ai essayé.

Edit 2 : Doh. Je pense qu'il est parce que, pour obtenir l'en-tête dans un tableau de lignes, j'explosa sur \n. Alors peut-être tout simplement \r\n sont maintenant \r ...

$c = explode("\n",$content);
Était-ce utile?

La solution

Vous devez vérifier aussi pour « \ r \ n » et « \ r », comme ceux-ci sont également valables de terminaison des lignes vides.

  

Quand sous forme canonique, les sous-types de médias de l'utilisation de type « texte » CRLF comme le saut de ligne de texte. HTTP détend cette exigence et permet le transport de supports de texte avec CR ordinaire ou LF seul représentant un saut de ligne quand il est fait régulièrement pour une entité du corps entier. Les applications HTTP DOIVENT accepter CRLF, CR nue et LF nue comme étant représentatif d'un saut de ligne dans les médias texte reçu via HTTP.

- HTTP / 1.1: Paramètres Protocole - 3.7. 1 et par défaut Texte de canonisation

Autres conseils

Les en-têtes se terminent avec une pause de deux lignes sans espace entre les deux (par exemple une ligne vide). Un saut de ligne peut être "\ n", "\ r \ n" ou tout simplement "\ r". Même si ce dernier est hors du commun, il doit encore être pris en compte.

Peut-être que vous pourriez trouver la fin des en-têtes avec une expression régulière comme

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top