2011-10-27 11 views
1

cssを別のパスで動作させるにはどのような方法が最適ですか。私はいくつかの異なるライブラリ(CrushCSS、minify)を見てきましたが、これらのファイルは(私がしたくない)ファイルを圧縮するだけで、このサービスの上にあるようです。css URLパスを別のフォルダに移動するときにCSS urlパスを再計算する方法

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

たとえば、入力:/base/my.css

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

予想される出力:/base/example/path/my.css

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

EDIT:

私は、 "ベストプラクティス" や、このタイプを避けるための方法に興味がないんだけど問題の私は変換を行う方法にのみ興味があるので、CSSは新しいパスで正しいままです。

答えて

2

私はMinifyからいくつかのコードをリファクタリングして、必要な抽象的な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

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

+0

これはcssファイルが既に存在するためオプションではありません。私はそれらを有効に保ちながらプログラム的に移動させる方法を探しています。 –

+0

私の場合でも、サイトベースは '/'であることが保証されていないので絶対パスは使用できません。 –

+0

彼らはいつも/何かになるだろう。あなた自身のドメインまたはサブドメインでは、/と相対的になります。サブディレクトリにある場合は、/サブディレクトリになります。 – GordonM

関連する問題