Domanda

Sto scorrendo ogni riga di una serie di CURL restituito intestazioni HTTP, cercando di rilevare quando si finisce e inizia il successivo. So che un header http termina con una riga vuota, ma che carattere è utilizzato per rappresentare questa interruzione di linea in php? Ho provato con \n ma non sembra funzionare. Io certamente potrei essere fare qualcosa di sbagliato.

Che personaggio è usato per rappresentare l'interruzione di riga usato per terminare un colpo di testa?

Ecco il mio codice esistente:

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

Risolto - Risulta che \r è quello che avrebbe dovuto essere corrispondente su. Molto strano. Non sono sicuro se questo cambia per ogni sito, o se è qualcosa impostato in ricciolo. Finora la sua \r su tutti i siti che ho provato.

Modifica 2 : Doh. Credo che sia perché al fine di ottenere l'intestazione in un array di linee, esplosi su \n. Quindi, forse, qualsiasi \r\n sono ora solo \r ...

$c = explode("\n",$content);
È stato utile?

Soluzione

È necessario controllare anche per "\ r \ n" e "\ r", come quelli sono validi anche terminare righe vuote.

  

Quando in forma canonica, i sottotipi dei media del "testo" tipo uso CRLF come l'interruzione di riga di testo. HTTP rilassa questa esigenza e permette il trasporto dei supporti testo con CR normale o LF sola rappresenta un'interruzione di riga quando avviene sempre per un intero corpo dell'entità. applicazioni HTTP deve accettare CRLF, CR nuda, e LF nuda come rappresentante di un'interruzione di linea nei mezzi di testo ricevuto via HTTP.

HTTP / 1.1: Parametri di protocollo - 3.7. 1 canonica e di testo predefiniti

Altri suggerimenti

Le intestazioni terminano con un'interruzione doppia linea senza spazio tra (cioè una riga vuota). Un'interruzione di riga può essere "\ n", "\ r \ n" o semplicemente "\ r". Anche se quest'ultimo è raro che deve ancora essere rappresentato.

Forse si potrebbe trovare la fine delle intestazioni con un'espressione regolare come

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top