それを別のフォルダに移動するときにcss urlパスを再計算する方法

cssを翻訳して別のパスで動作させる最良の方法は何ですか?私はいくつかの異なるライブラリ(CrushCSS、minify)を見てきましたが、これらのファイルは(私がしたくない)ファイルを圧縮するだけで、このサービスの上にあるようです。

私のベストは正規表現ですか?もしそうなら、私が扱う必要があるすべてのケースは何ですか?

For example, input: /base/my.css

@import url "../another/file.css"
#container {
    background: url('example/relative/path.png');
}
#container2 {
    background: url('/example/absolute/path.png');
}

Expected output: /base/example/path/my.css

@import url "../../../another/file.css"
#container {
    background: url('../relative/path.png');
}
#container2 {
    background: url('/example/absolute/path.png');
}

編集:

私は "ベストプラクティス"やこの種の問題を回避する方法には興味がありません。私は変換を行う方法にのみ興味があるので、CSSは新しいパスで正しいままです。

1

2 答え

私はあなたのサイトのルートに相対的なURLを常に使用することが最善の方法だと言いたいと思います。 /example/absolute/path.pngは、CSSファイルをどこに置いても常に動作します。

2
追加された
彼らはいつも/何かになるだろう。あなた自身のドメインまたはサブドメインでは、/と相対的になります。サブディレクトリにある場合は、/サブディレクトリになります。
追加された 著者 GordonM,
その場合、私はあなたには2つの現実的なオプションしかないと思います。 1)場所bのシンボリックリンクを作成し、問題のリソースへの両方のパスが有効になるようにするか、またはb)CSSファイルを必要に応じて再計算されたパスを持つCSSファイルを出力するPHPスクリプトに置き換えます。後者はスタイルシートのキャッシュに問題を引き起こすため、前者をお勧めします。
追加された 著者 GordonM,
これはcssファイルが既に存在するためオプションではありません。私はそれらを有効に保ちながらプログラム的に移動させる方法を探しています。
追加された 著者 Kendall Hopkins,
私の場合でも、サイトベースは/であるとは保証されていないため、絶対パスは使用できません。
追加された 著者 Kendall Hopkins,
私の場合、サイトは2つの異なるディレクトリから同時に見ることができます(私のやり方ではありません)。したがって、私が url( '/ path')を使用する場合、別の参照を破ることになります。私はそれが動作するために相対的なCSSを使用する必要があります
追加された 著者 Kendall Hopkins,

私は必要な抽象的なCSS変換を可能にするために、縮小のコードをリファクタリングすることに決めました。

<?php

//This class is heavy borrowed from Minify_ImportProcessor

class CSSImporter
{

    static function changePaths( $content, $current_path, $target_path )
    {
        $current_path = rtrim( $current_path, "/" );
        $target_path = rtrim( $target_path, "/" );
        $current_path_slugs = explode( "/", $current_path );
        $target_path_slugs = explode( "/", $target_path );
        $smallest_count = min( count( $current_path_slugs ), count( $target_path_slugs ) );
        for( $i = 0; $i < $smallest_count && $current_path_slugs[$i] === $target_path_slugs[$i]; $i++ );
        $change_prefix = implode( "/", array_merge( array_fill( 0, count( $target_path_slugs ) - $i, ".." ), array_slice( $current_path_slugs, $i ) ) );
        if( strlen( $change_prefix ) > 0 ) $change_prefix .= "/";

        $content = preg_replace_callback(
            '/
            @import\\s+
            (?:url\\(\\s*)?     # maybe url(
            [\'"]?              # maybe quote
            (.*?)               # 1 = URI
            [\'"]?              # maybe end quote
            (?:\\s*\\))?        # maybe )
            ([a-zA-Z,\\s]*)?    # 2 = media list
            ;                   # end token
            /x',
            function( $m ) use ( $change_prefix ) {
                $url = $change_prefix.$m[1];
                $url = str_replace('/./', '/', $url);
                do {
                    $url = preg_replace('@/(?!\\.\\.?)[^/]+/\\.\\[email protected]', '/', $url, 1, $changed);
                } while( $changed );
                return "@import url('$url'){$m[2]};";
            },
            $content
        );
        $content = preg_replace_callback(
            '/url\\(\\s*([^\\)\\s]+)\\s*\\)/',
            function( $m ) use ( $change_prefix ) {
               //$m[1] is either quoted or not
                $quote = ($m[1][0] === "'" || $m[1][0] === '"')
                    ? $m[1][0]
                    : '';
                $url = ($quote === '')
                    ? $m[1]
                    : substr($m[1], 1, strlen($m[1]) - 2);

                if( '/' !== $url[0] && strpos( $url, '//') === FALSE ) {
                    $url = $change_prefix.$url;
                    $url = str_replace('/./', '/', $url);
                    do {
                        $url = preg_replace('@/(?!\\.\\.?)[^/]+/\\.\\[email protected]', '/', $url, 1, $changed);
                    } while( $changed );
                }
                return "url({$quote}{$url}{$quote})";
            },
            $content
        );
        return $content;
    }

}

?>
2
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com