PHP Code zur Abfrage des User Agenten

son gohan

Erfahrenes Mitglied
Hallo,

ich habe da ein PHP Code von Thomas Scholz, welches ich in meine XHTML Seite einbauen will damit der User Agent des Brwoser zuerst abgefragt werden soll ob XHTML vom Browser unterstützt wird oder nicht. Wenn es vom Browser unterstützt wird, sollte der dazugehörige xhtml Madia Typ weitergegeben werden, wenn es nicht der Fall ist, dann soll der normale Media Typ für HTML weitergegeben werden.

Aber irgendwie stören sich die XML-Deklaration und der PHP Code in meiner Seite gegenseitig und ich bekomme eine Fehlermeldung vom XML Parser. Ich habe den PHP Code so wie er unten angegeben ist am Anfang meinerXHTML-Seite eingebaut. Danach in der nächsten Zeile habe ich direkt die XML-Deklaration eingebaut.

PHP Code von Thomas Scholz:
HTML:
<?php
function ua_accepts_xhtml() {
	/* Prüft, ob an den UA XHTML ausgeliefert werden darf.
	 * Gibt TRUE zurück, wenn ja, FALSE, wenn nicht. */

	/* In dubio pro HTML. */
	$xhtml = FALSE;
	$check_pattern = '|application/xhtml\+xml(?!\s*;\s*q=0)|';

	/* Behauptet der UA, XHTML zu können? */
	if (($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') and
		isset($_SERVER['HTTP_ACCEPT']) and
		preg_match($check_pattern, $_SERVER['HTTP_ACCEPT'])) {
			$xhtml = TRUE;
	}
	/* Ãltere Geckos haben ein paar Crashbugs mit XHTML. */
	if(isset($_SERVER['HTTP_USER_AGENT'])) {
		if(preg_match("|rv\:0.9|", $_SERVER['HTTP_USER_AGENT'])) {
			$xhtml = FALSE;
		}
	}
	return $xhtml;
}

/* Anwendung. */
$content_type   = ua_accepts_xhtml() ? 'application/xhtml+xml' : 'text/html';
header('Content-Type: ' . $content_type . ';charset=utf-8');
header('Vary: Accept, User-Agent');
header('Cache-Control: private');
?>

darunter wie bereits erwähnt habe ich meine XML-Deklaraton eingebaut:
HTML:
  <?xml version="1.0" encoding="ISO-8859-1"?>

Die Seite ist als xhtml lokal auf meinem Rechner abgespeichert und vom Schema Validator und normalen Validator aus valide.

Wenn ich die Seite aber lokal auf meinem Rechner im z.B. Firefox Browser lade, bekomme ich vom XML-Parser eine Fehlermeldung wie folgt:
HTML:
  XML Parsing Error: xml processing instruction not at start of external entity Location: file:///C:/xhtmlv.xhtml Line Number 31, Column 1:<?xml version="1.0" encoding="ISO-8859-1"?>

Wenn ich aber die gleiche Seite auf mein Server lade, und im Firefox Browser anschaue, dann bekomme ich keine Fehlermeldung mehr und die Seite wird auch angezeigt. Aber es wundern micg daran einige Sachen, zuerst habe ich mir gedacht das das ganze wohl auf dem Server deswegen läuft, weil der PHP-Interpreter so erst eingeschaltet wurde vom Server, aber als ich die gleiche Seite mit Endung xhtml dann im IE Browser geladen habe, wurde Sie auch in im angezeigt, wobei der IE doch keine XHTML Seiten anzeigen können sollte?.

Wenn ich mir dann auch noch den Quelltext im IE und den anderen Browser anschaue, dann wird am Anfang der komplette PHP Code wi ich ihn auch reingeschrieben habe angezeigt. das sollte doch aber nicht so sein, normalerweise sollte doch viel eher nur irgendwie der Medi Typ ausgegeben werden und nicht der komplette Quelltext sichtbar sein und vorallem sollte die XHTML Seite doch nicht im IE Brwoser erscheinen.

Also ich brauche hier unbedingt etwas Aufklärung, so einen seltsames Fall habe ich bis jetzt in noch keinem Forum nachlesen können.

Aber vielleicht liegt es wohl einfach daran, das der PHP Code von Thomas Scholz nicht richtig eingebaut wurde von mir.

Wie müsste ich das ganze den richtig einbauen. Hier auf der Seite http://home.arcor.de/terrikay/tutorials/xhtml.html wo ich den Code her habe steht auch nicht genau wo man das ganze einbauen muss. Und ob man den meta Tag
HTML:
 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
weckläst oder was man Standarmäsig darein schreibt. Oder am ehesten, ob der PHP Code wohl doch nicht genau in dieses Meta Tag hineingehört.

Nun ich bin völlig Ahnungslos und weis jetzt echt nicht merh weiter. :(
 
Zuletzt bearbeitet:
Wenn du Folgendes benutzt, sollte es eigentlich keine Probleme geben:
PHP:
<?php

	function ua_accepts_xhtml() {
		/* Prüft, ob an den UA XHTML ausgeliefert werden darf.
		 * Gibt TRUE zurück, wenn ja, FALSE, wenn nicht. */

		/* In dubio pro HTML. */
		$xhtml = FALSE;
		$check_pattern = '|application/xhtml\+xml(?!\s*;\s*q=0)|';

		/* Behauptet der UA, XHTML zu können? */
		if( ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') and isset($_SERVER['HTTP_ACCEPT']) and preg_match($check_pattern, $_SERVER['HTTP_ACCEPT']) ) {
			$xhtml = TRUE;
		}
		/* Ãltere Geckos haben ein paar Crashbugs mit XHTML. */
		if( isset($_SERVER['HTTP_USER_AGENT']) ) {
			if( preg_match("|rv\:0.9|", $_SERVER['HTTP_USER_AGENT']) ) {
				$xhtml = FALSE;
			}
		}
		return $xhtml;
	}

/* Anwendung. */
	$content_type = ua_accepts_xhtml() ? 'application/xhtml+xml' : 'text/html';
	$encoding = 'utf-8';

	header('Content-Type: '.$content_type.'; charset='.$encoding);
	header('Vary: Accept, User-Agent');
	if( ua_accepts_xhtml() ) {
		echo '<?xml version="1.0" encoding="'.$encoding.'"?>';
	}

?>
Wenn dies nun vom PHP-Interpreter verarbeitet wird, sollte es problemlos funktionieren. Ohne PHP-Interpreter wird es wohl zu einem XML-Parser-Fehler kommen.
 
Zuletzt bearbeitet:
Hallo,

die leztere Zeile im Code
HTML:
echo '<?xml version="1.0" encoding="'.$encoding.'"?>';
macht eine Fehlermeldung. Dort wird nichts eingefügt wenn man die Seite im Brwoser aufruft. Müsste da nicht normalerweise nicht der ISO Zeichencode stehen?

P.S. kann man den PHP Code auch so schreiben das immer eine XML Deklaration ausgegeben wird, weil ich meine Seiten in Qiuksmode machen will und sonst im IE Browser ohne XML-Deklaration nicht in Qiksmode geschaltet wird. Wenn ich dazu aber einfach die XML-Deklaration ausserhalb des PHP Codes schreibe, dann gibt es ja wieder ein Fehlermeldung, deswegen müsste man das irgendwie zusammenschreiben. Wie findest du überhaupt die Idee im Quiksmodus zu machen? Im Prinzip geht es ja fast nicht anders bei XHTML.

P.S.2 Muss ich die meta Angabe
HTML:
 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
wecklassen oder so mit drine lassen. Wenn der PHP Code aufgerufen wird, dann steht nämlich in der eigentlichen XHTML Seite immer noch text/html in dem meta TAg drine und das wäre doch dann der verkehrte Media Typ zu der Seite, verstehst du mich?
 
Zuletzt bearbeitet:
Wenn ein Browser in den Quirks-Modus schaltet, heißt das, dass das Dokument keine oder eine fehlerhafte Doctype-Angabe besitzt. Eine korrekte Doctype-Angabe ist bei XHTML jedoch Voraussetzung.
Weitergehend wird bei obigen PHP-Code nur dann die XML-Deklaration ausgegeben, wenn der Browser XHTML unterstützt und das Dokument auch als solches ausgeliefert wird. Und da du den Media-Typen bereits im HTTP-Header gesendet hast, ist eine weitere Angabe nicht erforderlich und sogar redundant.
 
Hallo,

Und da du den Media-Typen bereits im HTTP-Header gesendet hast, ist eine weitere Angabe nicht erforderlich und sogar redundant

1. ich kann also den meta Tag mit dem Media Typen rausnehmen, da das PHP Code von Thomas Scholz diesen schon automatisch weitergibt. bitte beststätigen da ich unsicher bin, vielen Dank.

Weitergehend wird bei obigen PHP-Code nur dann die XML-Deklaration ausgegeben, wenn der Browser XHTML unterstützt und das Dokument auch als solches ausgeliefert wird.
2. Gut, ich weis ja das das PHP Code nur bei XHTML Unterstüzung die XML-Deklaration weitergibt, aber ich wollte gerne meine Seiten im Quiksmodus gestalten und dazu brauche ich auch beim IE Browser eine XML-Deklaration.

3. Feststellung: wenn das PHP Code von Thomas Scholz den Media Typen an den Browser weitergibt, passiert das automatisch und ich muss mich auch nicht wundern, wieso dann später im Quelltext keine meta tag Zeile mit Mediy Typ Daten generiert wird?
 
Zuletzt bearbeitet:
Hallo Gumbo,

ich denke die größten Probleme mit meiner Seite jetzt dank deiner Hilfe gelöst zu haben, vielen Dank für deine Geduld.

ich beantworte meine Fragen vom vorigen Beitrag selber um dir die arbeit zu sparen, koriegier mich bitte wenn ich falsch liege.

zu1: ja
zu2: Pech gehabt, mach so und werd glücklich.;)
zu3: ja man, wie oft soll ich dir das noch zwitschern!


Aber, und jetzts kommts :-) , ich habe da noch ein kleines Problem, ;) .

In meiner Seite habe ich Javascript für ein Tooltip und eine Datum mit Uhranzeige eingebaut. Werden aber in der XHTML Seite leider nicht angezeigt.


Der erste Javscript Schnippsen ist über dem head Tag positioniert:
HTML:
  <script src="do-tooltip.js" type="text/javascript"></script>

dann folgen noch drei weitere unten vor dem ende des body Tags:
HTML:
 <script src="js/dw_event.js" type="text/javascript"></script>
<script src="js/dw_viewport.js" type="text/javascript"></script>
<script src="js/dw_tooltip.js" type="text/javascript"></script>
</body>
</html>

der Datum Anzeige Script ist mitten im der Seite:
HTML:
<script src="datum.js" type="text/javascript">&nbsp;</script>

Wieso geht der Tooltip und die Datum Anzeige bei XHTML Seiten nicht, also wenn die durch den XML Parser laufen. Wie muss man die richtig schreiben?

gruß
feh
 
Zu 1: Ja, du kannst die Meta-Angabe ruhigen Gewissens rausnehmen.

Zu 2: Entferne jeweils die Zeile vor und nach der „echo“-Zeile.

Zu 3: Wie ich (wahrscheinlich) bereits erwähnt hab, wird der Media-Typ im HTTP-Header an den UA gesandt. Die HTTP-Header-Informationen sind für den Benutzer in den meisten Browsern nicht direkt sondern nur indirekt sichtbar. Im Firefox werden beispielsweise die wichtigsten Seiteninformationen (dazu gehören auch einige per HTTP-Header gesendete Informationen) unter selbigen Kontextmenüeintrag zu finden.
 
Wenn du JavaScript in einem XHTML-Dokument nutzen möchtest, soll du dich mit dem DOM (Document Object Model) anfreunden. Denn Funktionen wie document.write(…) funktionieren nicht mehr, da in XHTML script-Elemente nur noch im head-Element erlaubt sind.
 
Hi,

ok ich les mal ein wenig darin herum, aber das sieht schon auf den ersten Blick komplizierter aus.

Also in meinem Tooltip werden die Javascriptadressen einmal eingesetzt und bei jedem Tooltip die Attribute
HTML:
onmouseover="doTooltip(event,tip29)" onmouseout="hideTip()"
 
Zuletzt bearbeitet:
Hallo,

ich habe mich versucht mal ein wenig über Dom schlau zu machen hier. http://www.jeckle.de/vorlesung/xml/script.html#DOM

aber das sieht ja so aus als ob ich grade meine Ausbildung zum Elektroinstallateur angefangen hätte und direkt eine Aufgabe der Seite 397 aus meinem Fachbuch lösen können sollte.

Also das kannst du echt nicht von mir verlangen die Codeansammlungen und Fachausdrücke da zu verstehen.

Für dich sieht das alles vielleicht nur so aus wie ein kleiner Ölwechsel, für mich aber sieht es aus wie eine komplettrenovierung eines 10 Etagen Hochhauses. Nein wollen wir mal nicht untertreiben, sagen wir 20 Etagen.

Ok, spaß bei Seite ich verstehe nur Banhof, also sag mir jetzt nicht das das ganze zu schwer und kompliziert durchzusetzten ist um meine Javascripts zum laufen zu bringen.
 
Zurück