7
votes

Preg_Replace des commentaires CSS?

J'écris un prégreau rapide pour dépasser les commentaires de CSS. Les commentaires CSS ont généralement cette syntaxe:

$pattern = "#/#";
$pattern = "/\//";


3 commentaires

Je ne l'apporterai pas comme une réponse car ce n'est pas vraiment applicable directement à la question, mais il existe de bons outils qui suppriment / minifiez le contenu CSS déjà: minifycsss.com juste pour ceux qui pourraient être ici essayant de réinventer la roue :)


Vous devriez mieux utiliser un analyseur. Sinon, vous supprimerez quelque chose comme contenu: "/ * ... * /" .


AvaTarkara - J'utilise en fait ce script: code.google.com/p/cssmin - Mais ce n'était pas enlevé des commentaires pour une raison quelconque. J'ai supposé que je devrais écrire ce peu en moi, mais comme d'autres scripts et réponses ne fonctionnent pas, il semble que quelque chose d'étranger se passe .... Ceci est destiné à être utilisé dans un plugin EE, donc je me demande si la chaîne Être transmis ou l'environnement a des bizarreries que je ne suis pas au courant. Merci pour le lien!


4 Réponses :


14
votes

Voici une solution:

.test{}


4 commentaires

Cela a sorti des espaces et des chevrons, mais semblait laisser tous les commentaires intacts. Cela semble certainement que la troisième ligne devrait également supprimer les commentaires. Déconcertant.


Salut là-bas, ça marche bien pour moi - totalement. Les commentaires ont tous été supprimés.


Intéressant! Merci pour le test mis à jour. Je suis à l'intérieur d'un plugin expressengine, alors je me demande si une différence d'environnement causait mes problèmes.


Les lignes 3 et 4 de cette regex lancent maintenant une erreur dans PHP 7.3 Avertissement: Preg_replace (): Échec de la compilation: la séquence d'évacuation n'est pas valide dans la classe de caractères Offset 4 - Question ici: Stackoverflow.com/questions/57829977/... Le code travaillait bien ... pendant des années ... lol



7
votes

Je ne crois pas que vous puissiez utiliser un regroupement dans une classe de caractères annulée comme si vous y avez. Ce que vous voulez vouloir utiliser s'appelle assertions , dont il existe deux types. "regarder-l'avant" et "look-derrière".

Le motif que vous recherchez en anglais est fondamentalement " Slash en avant, des caractères génériques littéraux, tout ce qui n'est pas suivi d'une barre oblique ou autre qu'une faute littérale qui est suivie d'une barre oblique ou d'une barre oblique qui n'est pas précédée d'une zone générique littérale zéro ni de plusieurs fois, une carte sauvage littérale, une barre oblique, " xxx


1 commentaires

Merci pour l'explication approfondie. Je ne peux pas obtenir cela pour travailler dans le fichier que je l'utilise, mais cela fonctionne parfaitement lorsqu'il est isolé, alors je soupçonne que j'ai plus de problèmes pour comprendre ...



0
votes

Juste pour le plaisir (et un petit projet bien sûr) J'ai fait une version non réégygoise d'un tel code (j'espère que c'est plus rapide):

function removeCommentFromCss( $textContent )
{
    $clearText = "";
    $charsInCss = strlen( $textContent );
    $searchForStart = true;
    for( $index = 0; $index < $charsInCss; $index++ )
    {
        if ( $searchForStart )
        {
            if ( $textContent[ $index ] == "/" && (( $index + 1 ) < $charsInCss ) && $textContent[ $index + 1 ] == "*" )
            {
                $searchForStart = false;
                continue;
            }
            else
            {
                $clearText .= $textContent[ $index ];
            }
        }
        else
        {
            if ( $textContent[ $index ] == "*" && (( $index + 1 ) < $charsInCss ) && $textContent[ $index + 1 ] == "/" )
            {
                $searchForStart = true;
                $index++;
                continue;
            }
        }
    }
    return $clearText;
}


0 commentaires

3
votes

J'ai eu le même problème. Pour résoudre ce problème, j'ai d'abord simplifié le code en remplaçant "/ astérits" et "astérix" avec des identifiants différents, puis utilisé ceux-ci comme des marqueurs de début et d'extrémité. XXX

Le drapeau / s indique La recherche d'aller sur de nouvelles lignes


2 commentaires

Solution excellente et stable!


Intelligent. Il fonctionne très bien. J'ai enlevé tous mes commentaires "//", les a remplacés avec / * ... * / commentaires et utilisé votre code. Bien fait, moins "//" signifie aussi moins de problèmes.