Gå til innhold

Får PHP-error på "<?xml" | Content-type-fix


Gjest Slettet+6132

Anbefalte innlegg

Gjest Slettet+6132
Skrevet (endret)

Heisann.

 

Satt og leste på XHTML 1.0 og fant ut at det var en liten deklarasjon jeg "manglet" (den er ikke påkrevd for at siden skal validiere)

 

Det som jeg prøver å sette inn er:

<?xml version="1.0" encoding="iso-8859-1"?>

Men når jeg refresher så får jeg opp en koselig error:

Parse error: parse error, unexpected T_STRING in /sesnurert/index.php on line 1

 

Er det noen måte å få PHP til å ikke reagere på "<?"?

 

EDIT: Et spørsmål til. Hvorfor får jeg "Type: text/html" selv om jeg har "application/xhtml+xml" som type?

EDIT 2: PHP v4.3.8 / Apache v1.3.31

Endret av Slettet+6132
Videoannonse
Annonse
Skrevet

Sett inn denne PHP-koden istedenfor kun selve XML-deklarasjonen:

<?php echo '<?xml version="1.0" encoding="iso-8859-1"?>'; ?>

 

Hvorfor får jeg "Type: text/html" selv om jeg har "application/xhtml+xml" som type?
Vanskelig å si uten å se scriptet som bestemmer hvilken type som skal sendes.
Gjest Slettet+6132
Skrevet

Takk, den første funka. Hvorfor tenkte jeg ikke på det selv? :p

 

Her er det som blir sendt ut til browseren:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

<head>
<title>eRik Web</title>
<link rel="stylesheet" href="style.css" type="text/css" />
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
<meta name="description" content="eRiks homepage" />
<meta name="keywords" content="eRik, ex0n, data, computer, linux, homepage, server, PC" />
<meta name="copyright" content="All your base are belongs to ME! :)" />
</head>

 

Du kan jo se selv

Skrevet (endret)

Hmm.. La faktisk merke til det samme på min egen side nå. Se vedlegg.

 

Kanskje serveren sender med en default header? *eksperimentere*

post-30-1116694514_thumb.jpg

Endret av Loomy
Gjest Slettet+6132
Skrevet (endret)
Hmm.. La faktisk merke til det samme på min egen side nå. Se vedlegg.

 

Kanskje serveren sender med en default header? *eksperimentere*

phpinfo() gir meg "default_mimetype text/html" hvertfall.

Endret av Slettet+6132
Skrevet

Aha, nå fant jeg en løsning. Lemp inn følgende øverst:

$accept = $_SERVER['HTTP_ACCEPT'];
if(stristr($accept,'application/xhtml+xml')) {
header('Content-type: application/xhtml+xml');
}

Da fikk jeg i hvert fall riktig content-type over alt :)

Gjest Slettet+6132
Skrevet
Aha, nå fant jeg en løsning. Lemp inn følgende øverst:

$accept = $_SERVER['HTTP_ACCEPT'];
if(stristr($accept,'application/xhtml+xml')) {
header('Content-type: application/xhtml+xml');
}

Da fikk jeg i hvert fall riktig content-type over alt :)

Såpass ja :D

 

Takk skal du ha, burde nesten visst det selv egentlig ;)

Skrevet

Jeg pleier som regel å gjøre det slik:

<?php
       $charset = 'iso-8859-1';
       $mime    = (strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml') !== false) ? 'application/xhtml+xml' : 'text/html';
       header('Content-Type:' . $mime . ';charset=' . $charset);

       if($mime == 'application/xhtml+xml'){echo '<?xml version="1.0" encoding="' . $charset . '"?>';}
     
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  xml:lang="no" lang="no">
<head>

Skrevet

Og jeg foretrekker dette scriptet, som er bombesikkert.

<?php

$charset = "iso-8859-1";
$mime = "text/html";
$declaration = '<?xml version="1.0" encoding="' . strtoupper($charset) . '"?>'."\r\n";

$fetch = apache_request_headers();

function fix_code($buffer)
{
return str_replace(" />", "/>", $buffer);
}

if(eregi('MSIE[ \/]([0-9\.]+)', $fetch['User-Agent']))
{
if(!stristr($fetch['User-Agent'], 'Opera'))
{
 $declaration = "";
}
}

if(stristr($fetch['Accept'], "application/xhtml+xml"))
{
if(preg_match("/application\/xhtml\+xml;q=0(\.[1-9]+)/i", $fetch['Accept'], $matches))
{
 $xhtml_q = $matches[1];
 if(preg_match("/text\/html;q=0(\.[1-9]+)/i", $fetch['Accept'], $matches))
 {
 	$html_q = $matches[1];
 	if($xhtml_q >= $html_q)
 	{
   $mime = "application/xhtml+xml";
 	}
 }
}
else
{
 $mime = "application/xhtml+xml";
}
}

if($mime == "application/xhtml+xml")
{
ob_start("fix_code");
}

header("Content-Type: $mime; charset=$charset");
header("Vary: Accept");

echo $declaration;


?>

Skrevet

...og jeg gikk tilbake til HTML 4.01 fordi jeg ble drittlei av CNT (Content Neogation Techniques), som den Lokaltog postet over, eller det jeg brukte på misinterpreted.org før.

 

Grunnen til at du ikke fikk sendt korrekt MIME-type tidligere, er at MIME-typen på et XML/XHTML-dokument må sendes før all annen output. :)

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...