2010-01-06 6 views
0

J'utilise PHP.Remplacer le texte entre @import et n

Je travaille sur un moyen de rassembler automatiquement tous mes fichiers CSS en un seul. Je charge automatiquement les fichiers CSS, puis les enregistre dans un plus grand, pour le téléchargement.

Dans mon installation locale, certaines lignes @import doivent être supprimées.

Il ressemble à ceci:

@import url('css/reset.css'); 
@import url('css/grid.css'); 
@import url('css/default.css'); 
@import url('css/header.css'); 
@import url('css/main.css'); 
@import url('css/sidebar.css'); 
@import url('css/footer.css'); 
body { font: normal 0.75em/1.5em Verdana; color: #333; } 

Si le style ci-dessus est dans une chaîne, comment puis-je la meilleure façon remplacer les lignes @ importation avec preg_replace ou mieux? Ce serait bien de ne pas laisser un espace blanc.

+1

Tu ne peux pas simplement utiliser http://code.google.com/p/minify/? – Gordon

Répondre

3

Cela devrait gérer via regex:

preg_replace('/\s*@import.*;\s*/iU', '', $text); 
+0

Ceci est si vous voulez * supprimer * les lignes comme vous l'avez mentionné: "Dans mon installation locale, j'ai certaines lignes @import qui doivent être supprimées." – Inspire

+0

Remplacerait également '@import url ('something.css'); body {color: #fff; } 'avec juste un'} ' – gnarf

+0

Court comme j'espérais. Cela fonctionne comme prévu. Il supprime les lignes avec @import. Merci! –

0

str_replace ("@ import", '', $ str);

+0

Cela supprime le @import mais je dois supprimer la ligne. Il devrait supprimer les informations entre @import et \ n. –

1

Vous pouvez facilement itérer sur chaque ligne, puis déterminer si elle commence par @import.

$handle = @fopen('/path/to/file.css', 'r'); 
if ($handle) { 
    while (!feof($handle)) { 
     $line = fgets($handle, 4096); 
     if (strpos($line, '@import') !== false) { 
      // @import found, skip over line 
      continue; 
     } 
     echo $line; 
    } 
    fclose($handle); 
} 

Ou si vous voulez stocker le fichier dans un tableau à l'avant:

$lines = file('/path/to/file.css'); 
foreach ($lines as $num => $line) { 
    if (strpos($line, '@import') !== false) { 
     // @import found, skip over line 
     continue; 
    } 
} 
+0

Cela fonctionnerait mais cela ne semble pas être la meilleure façon de le résoudre. Si je ne trouve rien de mieux, je pourrais utiliser celui-ci. –

+0

Regex est lente, cela vous permettra de créer un nouveau fichier en temps linéaire en supposant que vous créez la sortie que vous itérez sur chaque fichier. –

+0

Est-ce que regexp est plus lent? Parce que je ne génère que le fichier CSS sur un hôte local, la vitesse n'a pas d'importance pour moi. Le serveur charge le fichier généré téléchargé. Je vais utiliser le preg_replace d'Inspire. Merci quand même! –

0

Il pourrait être plus facile de trouver les @imports utilisant preg_match, puis les remplacer en utilisant str_replace

$str = "<<css data>>"; 
while (preg_match("/@import\s+url\('([^']+)'\);\s+/", $str, $matches)) { 
    $url = $matches[1]; 
    $text = file_get_contents($url); // or some other way of reading that url 
    $str = str_replace($matches[0], $text, $str); 
} 

en ce qui stripping que toutes les lignes @import:

preg_replace("/@import[^;]+;\s+/g", "", $str); 

devrait faire le travail ...

+0

J'ai trouvé une réponse plus courte écrite par Inspire, une seule ligne. Merci quand même! –

Questions connexes