2012-04-24 13 views
1

str_replaceを使用してCSS出力をクリーンアップしようとしていますが、定義された開始点と終了点を持つ文字列ブロックを無視する必要があります。PHPがstr_replaceの文字列ブロックを無視する

で始まる何かを無視:無視する

@media blah(this can be any value) { 

内容:

.class { 
    property: value; 
    } 

で終わる:

}/*ends*/ 

そして、代わりにそのブロックの外側でstr_replaceを行います

.otherclass {property:value;} 

PHP:う

.otherclass { 
    property:value; 
    } 

方法:

$output = str_replace("{", "{\n", $output); 
$output = str_replace("}", "}\n", $output); 

理由は@mediaブロックがすでに正しくフォーマット、およびstr_replaceたシンプルなリターン読める線で触れるべきではないです適切なインデントを必要とするということですあなたはPHPでそれを言う?

ありがとうございます。

+2

これは、ファイルをフォーマットする奇妙な方法です。正規表現を調べ、そこにもっと柔軟性を持たせてください...ファイル全体を配列に読み込んで配列全体を走査してください。もしあなたが '{' indentを開くタグに出会ったら、 '@ media'をスキップしたら...また、このスレッドを参照してくださいhttp://stackoverflow.com/questions/1376958/linux-automated-code-formatting-php-javascript-html-css-mysql – Alex

+0

動的な集約とCSSの抽出、なぜ彼らは異なるフォーマットを持っているCSSコードブロックなので、IDEはここにはありません。設定定義に基づくカスタム入力。ほとんどの場合、無視するブロックをフォーマットし、外部CSSファイルをいくつかコピーし、圧縮された読み取り不可能なバージョンとして1つのファイルに追加します。今、私はいくつかの@mediaブロックを無視しながら、それらの集約/圧縮バージョンをより読みやすいCSSコードブロックに処理する必要があります。ありがとうございました – swan

答えて

1
$string = 
"@media blah(this can be any value) { 
.class { 
    property: value; 
    } 
}/*ends*/ 

.otherclass {property:value;} 

.otherclass {property:value;} 

@media blah(this can be any value) { 
.class { 
    property: value; 
    } 
}/*ends*/ 

.otherclass {property:value;} 

.otherclass {property:value;}"; 

$arr = explode("\r", $string); 

$ignore_block = false; 
for ($i = 0; $i < count($arr); $i++) 
{ 
    if (strstr($arr[$i], '@media')) 
     $ignore_block = true; 
    elseif (strstr($arr[$i-1], '/*ends*/')) 
     $ignore_block = false; 

    if ($ignore_block == false) 
    { 
     $arr[$i] = str_replace("{", "{\n\t", $arr[$i]); 
     $arr[$i] = str_replace("}", "\n}\n", $arr[$i]); 
    } 
} 
file_put_contents("test.txt", implode("\n", $arr)); 

後読みが可変長を許可していませんので、正規表現は動作しません。試して、ファイルをループしてください。

+0

ありがとうございます。ほとんど例外はありません。Notice:Undefined offset:-1 – swan

+0

右回りには、 '$ i-1'をチェックしてください。 – Jack

1

また、正規表現はあなたにもっと柔軟性を与える方法です。

純粋な解決策は、最初にすべての出現を出力ソースから取り出し、残りのコードでstr_replaceを使用して戻すことです。行の後のコード行を調べて、str_replaceだけを実行してみることもできます。

また、正規表現を使用することをお勧めします。

1

正規表現できない:何あなたが探しているのは@media

参照によって前に続くものと一致しないことを言って、にpreg_replaceのようですカウントするので、彼らは(一般的には)の解析には適していません。つまり、入力フォーマットを有効なCSSのフルセットよりも制限することができない限り、期待通りに動作しないケースもあります。

また、CSSを完全に解析して結果のCSSツリーをルールを使って歩くことで、データの出力方法を指定することもできます。ここでのCSSパーサライブラリが明らかにあります:

http://www.phpclasses.org/package/1289-PHP-CSS-parser-class.html

+1

PCRE(PHPの 'preg_ *'関数で使用されています)は "数える"ことができます(私はここで、反復を意味すると仮定しています、 '{'と '}' '{3,14}')。もちろん、再帰は「通常」ではなく、PCREもどちらでもないが、確かにトークンマッチングのための有効なツールである。 – eyelidlessness

+0

申し訳ありません、はい、私は有用な再帰的なカウントを意味しました。もちろん、反復カウントは広くサポートされています(theres +、*、?、{num}、{min、max})。しかし、ここでバランスのとれたマッチングが役立つかどうかはわかりません –

関連する問題