2010-11-13 6 views
1

J'essaie de remplacer toutes les chaînes @import dans une seule chaîne, par ex.javascript regex single-line

var str = 'buttons .reprint{height:56px;background-position:-47px -1496px;}@import "../common/buttons.css";@import "../screen/screen-1.css";@import "../screen/screen-2.css";@import "../screen/screen-3.css";@import "../screen/screen-5.css";@import "../screen/screen-6.css";@import "../screen/screen-7.css";@import "../screen/screen-quick-messages.css";@import "../screen/reset-password.css";#xml-data{display:none;}body{font-family:"Helvetica Neue",HelveticaNeue,Helvetica-Neue,Helvetica,sans-serif;}ul{padding:0;}body,section{width:768px;}'; 

Il fonctionne si je vous écris:

console.log(str.match(/@import\ /g)); 

Mais comment préciser, toute déclaration @import du tout en une seule ligne, par exemple @import "../screen/screen-1.css";

console.log(str.match(/@import\ .+;/g)); 

ne fonctionne pas.

+0

Qu'est-ce que vous essayez de remplacer les importations avec? – corriganjc

+2

Quant à la raison pour laquelle votre '. +' "N'a pas fonctionné", le type de "ne fonctionne pas" que je peux penser est qu'il correspond trop, parce que + est gourmand, ce qui signifie qu'il irait à la dernière point-virgule trouvé. L'ajout de '?' À un quantificateur le rend non gourmand - donc '/ @ import \. +?;/G' fonctionnerait. Mais vous pourriez potentiellement avoir des points-virgules dans l'URL, donc la réponse de Tim est évidemment bien meilleure. Je voulais juste expliquer ce qui n'allait pas au cas où cela aiderait une autre fois. Mais soyez aussi précis que possible, cela évite les erreurs. –

Répondre

3

-moi si je me trompe, mais il semble comme un @import a toujours ce format:

@import (espace) (citation) (un ou plusieurs caractères non-citation) (citation) (virgule)

Si cela est vrai, alors nous allons construire les regex en conséquence:

/@import\s*"[^"]+";/ 

Cela devrait correspondre à chaque separatel déclaration @import y.

+0

Merci beaucoup! Vous avez sauvé mon temps :) –

+0

Je pense que la solution donnée par quelque chose de kindawierd est plus générale et mérite d'être marquée comme réponse. – Roboblob

+0

@Roboblob: C'est peut-être le cas (bien qu'Alex semble être en désaccord), mais pourquoi est-ce une raison de baisser ma réponse? –

1

Je sais que c'est déjà répondu, mais je veux juste offrir une version plus simple du modèle ci-dessus.

J'avais besoin de cette regex pour supprimer les instructions @import des fichiers css que j'ai fusionnés.

Il correspond au modèle:

@import (anything NOT a semicolon) (semicolon) 

Fonctionne très bien. Voici un exemple de comment je l'utilise:

// $mergedStyles set earlier in script... 

// matches the pattern 
// ["@import"]+[anything NOT a semicolon]+semicolon 
// e.g.: "@import url("stuff"); 
$pattern = '/@import[^;]*;/'; 
$mergedStyles = preg_replace($pattern, '', $mergedStyles); 
+0

Merci pour le partage, j'aime mieux cette solution car c'est plus général et attrape plus de variantes de @import. – Roboblob