Ich arbeite derzeit an einer Minification-Aufgabe als Post-Commit-Hook. Ich benutze die aktuelle Version von yui-compressor für CSS-Minification.sed regulären Ausdruck zu beheben css Verkleinerung
Schlechte Sache über die aktuelle Version von yui-Kompressor: Es bricht bestimmte CSS3-Regeln, die Whitespaces brauchen, um richtig zu funktionieren. (calc (10px + 10px))
Um das Problem zu beheben, schrieb ich einen regulären Ausdruck, der jedes Auftreten von calc (...) nach der Komprimierung ersetzen sollte.
meine Lösung so weit ist die folgende RegEx:
Match: /calc\((.*?)([\/\+\-\*])(.*?)\)/g
ersetzen: calc(\1 \2 \3)
ich zwei Online-Tools verwenden meinen regulären Ausdruck zu validieren:
Es funktioniert auch in PHP. Aber sobald ich verwende „sed“ nur das letzte Vorkommen pro Zeile ersetzt wird:
Komprimierte CSS: (vor dem Ersetzen mit regulären Ausdrücken)
.test{width:calc(1px+1px)}.test2{left:calc(4%+140px)}.test3{width:calc(1px+1px)}
.test{width:calc(1px-1px)}.test2{left:calc(4%-140px)}.test3{width:calc(1px-1px)}
.test{width:calc(1px*1px)}.test2{left:calc(4%*140px)}.test3{width:calc(1px*1px)}
.test{width:calc(1px/1px)}.test2{left:calc(4%/140px)}.test3{width:calc(1px/1px)}
CSS nach regulärem Ausdruck: (und richtigen Ergebnis)
.test{width:calc(1px + 1px)}.test2{left:calc(4% + 140px)}.test3{width:calc(1px + 1px)}
.test{width:calc(1px - 1px)}.test2{left:calc(4% - 140px)}.test3{width:calc(1px - 1px)}
.test{width:calc(1px * 1px)}.test2{left:calc(4% * 140px)}.test3{width:calc(1px * 1px)}
.test{width:calc(1px/1px)}.test2{left:calc(4%/140px)}.test3{width:calc(1px/1px)}
in debian sed 8 - (Laden die gleichen Regeln aus einer Datei):
sed -r "s/calc\((.*?)([\/\+\-\*])(.*?)\)/calc(\1 \2 \3)/g" style.css
druckt die folgenden:
.test{width:calc(1px+1px)}.test2{left:calc(4%+140px)}.test3{width:calc(1px + 1px)}
.test{width:calc(1px-1px)}.test2{left:calc(4%-140px)}.test3{width:calc(1px-1px)}
.test{width:calc(1px*1px)}.test2{left:calc(4%*140px)}.test3{width:calc(1px * 1px)}
.test{width:calc(1px/1px)}.test2{left:calc(4%/140px)}.test3{width:calc(1px/1px)}
Es scheint nicht mit sed zu arbeiten. Hat jemand eine Ahnung, was zum Teufel ist los?
Vielen Dank im Voraus!
Funktioniert wie ein Charme. Danke vielmals. Ich war mir nicht bewusst, dass sed so "primitiv" ist. –
Gern geschehen. Tatsächlich kann 'sed' viel mehr tun als ersetzen (' s' Befehl). Es hat Verzweigungs- und Schleifenkonstrukte; ziemlich mächtig, in der Tat. :) Leider wird PCRE nicht unterstützt, aber wenn Sie es brauchen, möchten Sie vielleicht Perl ausprobieren. – randomir