Wer vor dem Problem steht, dass ein Kunde bei einer Web-Anwendung unbedingt Tabellen-Zeilen mit wechselnden Farben je gerader und ungerader Zeile wünscht und dafür ca. 200 Kilobyte Quellcode überarbeiten müsste, der kann es sich ein wenig vereinfachen, wenn folgender Code vor der Ausgabe auf den auszugebenden Inhalt angewendet wird.
Das Skript durchsucht mit zwei kleinen Regular Expressions den Inhalt nach Tabellen und weist dann den Tabellen-Zeilen entsprechende Klassen (even/odd) zu. So können alle Tabellen per CSS formatiert werden. Klar leidet darunter die Performance etwas, aber sicherlich nicht viel mehr, als wenn ich in jeder Schleife in der eine Tabelle aufgebaut wird ein Zähler mitlaufen lasse und eine Bedingsabfrage mache.
// Convert table rows to even/odd class
preg_match_all( "/<table.*>(.*)<\/table>/siU", $html, $matches );
if( $matches )
{
foreach( $matches[ 1 ] AS $tbody )
{
$new_rows = '';
if( preg_match_all( "/<tr.*>.+<\/tr>/siU", $tbody, $tbmatches ) )
{
$i = 0;
foreach( $tbmatches[ 0 ] AS $tr )
{
// Ignore rows containing th cells
if( strpos( $tr, '<th' ) === false )
{
if( $i % 2 == 0 )
$new_rows .= str_replace( '<tr', '<tr class="even"', $tr );
else
$new_rows .= str_replace( '<tr', '<tr class="odd"', $tr );
$i++;
}
else $new_rows .= $tr;
}
$html = str_replace( $tbody, $new_rows, $html );
}
}
}
Im Grunde ganz einfach: Die erste RegEx sucht alle vorhanden Tabellen und deren Inhalt. Danach werden die Zeilen des Inhalts ebenfalls per RegEx ermittelt und per Zeichenersetzung angepasst.
Vielleicht hilft das ja Jemandem irgendwann mal…

Wozu einen Zähler? Wenn würde ich das in etwa so ablaufen lassen:
$even = 0;
foreach(@row) {
print $even ? ” : ”;
$even = !$even;
[…]
}
Ich glaube, alleine das matchen einer regexp ist aufwändiger als das bisschen Code oben ;)
Ich zitiere mich mal selber: “und dafür ca. 200 Kilobyte Quellcode überarbeiten müsste”
Das Problem war, dass es erst NACHTRÄGLICH implementiert werden sollte. Und dafür hätten dann alle Ausgaben überarbeitet werden müssen… da war die RegEx wesentlich einfacher…