Über mich

Startseite arrow Tipps & Tricks arrow Inhalte mit PHP abfangen - ob_start() und ob_get_contents()

Inhalte mit PHP abfangen - ob_start() und ob_get_contents()

Dienstag, 17. Februar 2009
Geschrieben von Armin Vieweg
Eine sehr nützliche Funktion in PHP ist ob_start und ob_get_contents. Es wird damit ermöglicht alles was dazwischen steht in eine Variable zu speichern und so weiterzuverwenden.

Mir geht es oft so, dass ich auf einer Website etwas automatisieren möchte. Links die extern sind sollen z.B. eine extra Klasse erhalten und Bilder die kleiner als 150 Pixel breit sind sollen keinen Rahmen haben.



Solche Dinge kann man im Quellcode berücksichtigen, in dem man entsprechende Klassen definiert und anschließend den Elementen zuweist.

Hat man nun aber ein CMS im Einsatz und möchte dies für den End-Nutzer so einfach wie möglich machen bietet es sich an solche Regeln zu automatisieren.

Manche CMS-Systeme schreiben die komplett geparste Website von sich aus in eine Variable und geben diese dann aus. So kann man mit verschiedenen Replace-Befehlen auf diese Variable zugreifen und die Inhalte nach Belieben verändern. Andere CMS oder komplett von Hand erstellte Webseiten machen dies nicht unbedingt.

Für jenen, der sich der enormen Flexibilität jedoch nicht berauben lassen möchte gibt es folgende Befehle in PHP:

ob_start();
   // ... die Inhalte der Website ...
$inhalte = ob_get_contents();
ob_end_clean();


(ob steht übrigens für Output Buffer, dt. Ausgabe-Puffer)

Ohne die drei zusätzlichen Zeilen würde die Website normal ausgegeben werden. Das ob_end_clean(); leert jedoch den Ausgabe-Puffer von PHP und so erhält man nun nur eine weiße Seite.

Man muss hinter das ob_end_clean(); also noch ein echo($inhalte); schreiben, denn mit dem Befehl ob_get_contents(); haben wir den Ausgabe-Puffer bevor er geleert wurde in die Variable $inhalte geschrieben.

Vor dem Echo der $inhalte können wir aber die Variable nach Belieben verändern. Um beispielsweise das Wort "Sonne" durch "Mond" auszutauschen, müsste der Code so aussehen:

ob_start();
  // ... die Inhalte der Website ...
$inhalte = ob_get_contents();
ob_end_clean();

$inhalte = str_replace("Sonne", "Mond", $inhalte);
echo ($inhalte);



Diese Regel wirkt sich auf die komplette Website aus. Überall wird nun das Wort "Sonne" durch "Mond" ersetzt. Zugegeben dies ist ein recht einfaches Beispiel, jedoch kann man auf die Art und Weise eine Menge Dinge automatisieren und vereinheitlichen.



Den ob_start(); Befehl einzubauen ist relativ einfach, je nach dem wo man dies machen möchte.

Im CMS Joomla besteht das Design z.B. aus einer index.php Datei. Ganz oben das ob_start und am Ende den Rest definiert. Das sieht dann in Joomla 1.0.x z.B. so aus (gekürzte Fassung):

<?php
defined( '_VALID_MOS' ) or die( 'Restricted access' );
ob_start();
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
  <?php mosShowHead(); ?>
  <meta http-equiv="Content-Type" content="text/html; <?php echo _ISO; ?>">
</head>
<body>

  <div id="navi">
    <?php mosLoadModules ( 'navigation', -1 ); ?>
  </div>

  <div id="content">
    <?php mosMainBody(); ?>
  </div>

</body>
</html>

<?php
    $inhalte = ob_get_contents();
    ob_end_clean();

    $inhalte = str_replace('/>', '>', $inhalte);
    $inhalte = str_replace(' & ', ' & amp; ', $inhalte);
    $inhalte = str_replace('€', '& euro;', $inhalte);

    echo $inhalte;
?>



Hier gibt es drei Replacements. Der erste macht aus XHTML-Tags HTML-Tags, der zweite aus einem &-Zeichen das vorgeschriebene HTML-Entity & und das dritte aus dem Euro-Zeichen ein €.



In Zukunft möchte ich noch mehr, komplexere Beispiele vorstellen wie man sich diese Technik effizient zu Nutze machen kann.


  Kommentare (5)
 1 Geschrieben von: heroldini, am 15.03.2009 um 12:57
cool, bin zwar grade nicht unbedingt auf der suche nach dem hier gewesen, aber da es nicht so lang war hab ich es einfach mal durchgelesen... und schwup schon wieder einen kleinen vorteil mehr im kopf ;) 
 
danke, weiter so... 
mfg
 2 Geschrieben von: crazywulf, am 05.08.2009 um 08:27
"Der erste macht aus XHTML-Tags HTML-Tags" 
Das erste zerstört wohl eher den ganzen Code :-D 
 
Greetz
 3 Geschrieben von: Armin Vieweg, am 05.08.2009 um 09:06
Der Replace wird gegenwärtig hier im Blog erfolgreich verwendet.
 4 Geschrieben von: Mischa, am 03.11.2009 um 11:47
Sehr umfangreich, exakt und "menschlich" beschrieben - vielen Dank!!!!
 5 Geschrieben von: freddy, am 22.06.2011 um 20:54
danke, war nützlich ;)
Letzte Aktualisierung ( Sonntag, 8. März 2009 )
 
< Zurück   Weiter >