Frage

Ich bin Schleife durch jede Zeile aus einer Reihe von CURL zurück HTTP-Header zu erfassen versuchen, wenn man aufhört und der nächste beginnt. Ich weiß, dass ein HTTP-Header mit einer leeren Zeile endet, aber welche Zeichen verwendet, um diesen Zeilenumbruch in PHP zu vertreten? Ich habe mit \n versucht, aber es scheint nicht zu funktionieren. Ich kann sicher sein, etwas falsch zu machen.

Welche Zeichen wird verwendet, um den Zeilenumbruch darzustellen verwendet einen Header zu beenden?

Hier ist mein vorhandener Code:

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

Gelöst - Es stellte sich heraus, dass \r ist, was soll ich passend haben. Sehr komisch. Nicht sicher, ob dies pro Standort ändert, oder wenn es etwas in curl gesetzt. Bisher seine \r auf allen Seiten, die ich ausprobiert habe.

Edit 2 : Doh. Ich denke, es liegt daran, um den Header in eine Anordnung von Linien zu bekommen, ich es auf \n explodierte. Also vielleicht jede \r\n sind jetzt nur \r ...

$c = explode("\n",$content);
War es hilfreich?

Lösung

Sie müssen auch für „\ r \ n“ und „\ r“ prüfen, wie die auch gültig sind beendet Leerzeilen.

  

Wenn in kanonischer Form, Medien-Subtypen des „Text“ Typ Verwendung CRLF als Textzeilenumbruch. HTTP entspannt sich diese Anforderung und erlaubt den Transport von Textmedien mit glatten oder CR LF allein einen Zeilenumbruch darstellt, wenn es konsequent für eine gesamte Einheit-Körper durchgeführt wird. HTTP-Anwendungen müssen CRLF, blank CR akzeptieren, und nackte LF als repräsentativ für einen Zeilenumbruch in Textmedien über HTTP übermittelten.

- HTTP / 1.1: Protokoll-Parameter - 3.7. 1 Kanonisierung und Text Defaults

Andere Tipps

Die Header ohne Raum mit einem doppelten Zeilenumbruch enden dazwischen (dh eine leere Zeile). Ein Leitungsbruch kann entweder "\ n", "\ r \ n" oder einfach nur "\ r" sein. Auch wenn dies ungewöhnlich ist es muss noch berücksichtigt werden.

Vielleicht könnten Sie das Ende des Header mit einem regulären Ausdruck wie

finden
list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top