Update: Google jsmin.php und magic_quotes_runtime

»  Erstellt in Nützliches, Sonstiges von Holger Schöttle, Dienstag, 29. Januar 2008

Ich musste heute feststellen, dass der im vorherigen Beitrag beschriebene Workaround nur die halbe Wahrheit ist. Dies hat zwei Gründe:

  1. Es ist nicht die magic_quotes_runtime Option allein, die den Input manipluliert.
  2. Die oben beschriebene Ableitung funktioniert nicht, da der Kontext des Objekts beim statischen Zugriff auf die minify()-Methode noch immer den Original-Konstruktor verwendet.

Wie man im PHP-Manual nachlesen kann, ergibt sich eine neue Situation für den Input, wenn neben magic_quotes_runtime auch die Option magic_quotes_sybase aktiviert ist. Dann werden die Quotations nicht durch Backslashes escaped sondern in weitere Single-Quotes eingebettet. D.h. es passiert folgendes:

$input = "Hier steht ein 'Text' und so";

Daraus wird dann bei nur magic_quotes_runtime aktiviert:

$input = "Hier steht ein \'Text\' und so";

und bei aktivierten magic_quotes_runtime und magic_quotes_sybase:

$input = "Hier steht ein ''Text'' und so";
(jeweils 2 Single-Quotations vor und nach dem Wort "Text")

Somit bringt die Lösung mit der Verwendung von stripcslashes() relativ wenig. Mit zwei weiteren Zeilen Code allerdings kann man auch dieses Problem lösen. Hier nun auch gleich die korrekte Ableitung der JSMin-Klasse:

<?
/**
 * Klasse, die von JSMin erbt
 */
class JSMinimizer extends JSMin
{
    /**
     * Überladener Konstruktor
     *
     * @param string $input Input (JavaScript-Code)
     */
    public function __construct( $input )
    {
        if ( get_magic_quotes_runtime() && ini_get( 'magic_quotes_sybase' ) )
            $input = str_replace( "''", "'", $input );
        elseif ( get_magic_quotes_runtime() )
            $input = stripcslashes( $input );

        parent::__construct( $input );
    }

    /**
     * Komprimiert JavaScript-Code
     *
     * @param string $input Input (JavaScript-Code)
     * @return string Komprimierter Output
     */
    public static function minify( $input )
    {
        $jsmin = new JSMinimizer( $input );
        return $jsmin->min();
    }
}
?>

Hier noch der Link zur entsprechenden Info auf php.net
http://de.php.net/manual/de/ref.info.php#ini.magic-quotes-runtime


Google jsmin.php und magic_quotes_runtime

»  Erstellt in Nützliches, Sonstiges von Holger Schöttle, Samstag, 26. Januar 2008

JavaScript CompressionWer die PHP-Klasse vom Google-Projekt JSMin, einer PHP-Portierung des von Douglas Crockford entwickelten JavaScript-Minimizers, benutzt, wurde veilleicht schon einmal mit der folgenden Fehlermeldung konfrontiert:

Uncaught Exception: Unterminated string literal. [0]
jsmin.php on line 94

Diese Fehlermeldung ist zurückzuführen auf die Überprüfung von Unix-Linefeeds (ord($str) == 10) im übergebenen JavaScript-Code. Diese wiederum werden verursacht durch zwei aufeinander folgende einfache Anführungszeichen. Nun sollte man sich die Frage stellen, woher kommen diese Anführungszeichen in einer JavaScript-Datei, die sonst wunderbar funktioniert? Das Problem ist die PHP-Einstellung “magic_quotes_runtime”. Ist diese eingeschaltet, so werden einige Passagen im JavaScript durch PHP automatisch quotiert.

Nun gibt es drei Möglichkeiten diesem Problem mit einer Lösung beizukommen:

  1. Einfach die Einstellung “magic_quotes_runtime” generell abschalten
    (in der php.ini oder per .htaccess im DOCUMENT_ROOT).
  2. Die Einstellung per .htaccess nur in dem Order, in dem die jsmin.php liegt abschalten.
    (php_value magic_quotes_runtime 0)
  3. Den Konstruktor der Klasse überschreiben, um einen Kompatibilitätsmodus zu erhalten, der es erlaubt die JSMin-Klasse zu verwenden, egal ob magic_quotes_runtime eingeschaltet ist, oder nicht. Wie man das macht, wird nachfolgend erklärt:

Überschreiben des Konstruktors von JSMin

<?
/**
 * Klasse, die von JSMin erbt
 */
class JSMinimizer extends JSMin
{
    /**
     * Überladener Konstruktor
     *
     * @param string $input Input (JavaScript-Code)
     */
    public function __construct( $input )
    {
        if ( get_magic_quotes_runtime() )
            $input = stripcslashes( $input );

        parent::__construct( $input );
    }
}
?>

Es empfiehlt sich an dieser Stelle eine neue Klasse anzulegen, die von der JSMin-Klasse erbt, da man sonst diesen Workaround in jeder neuen Version von JSMin wieder eintragen müsste. Wobei zu hoffen ist, dass die Entwickler von JSMin (PHP) den Workaround mit in die nächste Version ihrer Klasse aufnehmen. Informiert sind sie jedenfalls.

Weitere Verweise zu JSMin:


Colossus – Neues Album von Smoke Blow

»  Erstellt in Band-Infos von Holger Schöttle, Donnerstag, 3. Januar 2008

Neues Material von Smoke Blow, alle Liebhaber der Band wissen was das heißt!

Die Platte erscheint voraussichtlich am 28. März 2008 auf PIAS (Rough Trade).

Bei Amazon (vor)bestellen für 19,99 EUR (siehe Box rechts!):
http://www.amazon.de/Colossus-Smoke-Blow/dp/B0011FMH0E

Alle Infos zur Band:

http://www.smokeblow.de
http://www.myspace.com/smokeblow

Merchandise:
www.deutschrock.de | www.genepool-music.net


 
RSS-Feed - Alle Beiträge RSS-Feed - Kommentare

Januar 2008
M D M D F S S
« Nov   Feb »
 123456
78910111213
14151617181920
21222324252627
28293031