5

I have this line of code that I'm using to prepare some CSS file:

TheMinifiedCSS = TheMinifiedCSS.Replace("white", "#FFF");

The problem is that in CSS, I have this declaration:

.SomeClass{white-space:pre-wrap;}

How do I change the .Replace statement to replace white with #FFF but to leave white-space alone?

Thanks.

Note, I know I can add TheMinifiedCSS = TheMinifiedCSS.Replace("#FFF-space", "white-space"); but I'm looking for something cleaner.

4

6 に答える 6

1

正規表現は、物事をより複雑にする可能性があります。これが機能するソリューションです。コメントと文字列のソリューションもあります。

    static void Main(string[] args)
    {
        string test = ".white> TD { color: white;box-shadow: 0px 0px 3px white, inset 0px 0px 5px black; white-space:pre-wrap; background-image='white black \" white \"'}";
        Console.WriteLine("Before: " + test);
        test = replaceInCSS(test, "white", "green");
        Console.WriteLine("After: " + test);
        Console.ReadLine();
    }

    static string replaceInCSS(string text, string replace, string replacement)
    {
        char[] forceBefore = new char[]{ '\n', '\t', ';', '{', ' ', ':', ','};
        char[] forceAfter = new char[] { ';', '}', ' ', ','};

        int index = text.IndexOf(replace, 0);
        while (index != -1)
        {
            if (!indexWithinStringOrComment(text, index))
            {
                int afterPos = index + replace.Length;
                bool beforeOk = false, afterOk = false;

                if (index > 0 && forceBefore.Contains<char>(text[index - 1]))
                    beforeOk = true;
                if (afterPos < text.Length - 1 && forceAfter.Contains<char>(text[afterPos]))
                    afterOk = true;

                if ((index == 0 || beforeOk) &&
                    (afterPos == text.Length - 1 || afterOk))
                {
                    text = text.Remove(index, replace.Length);
                    text = text.Insert(index, replacement);
                }
            }

            index = text.IndexOf(replace, index + 1);
        }

        return text;
    }

    static bool indexWithinStringOrComment(string text, int index)
    {
        bool insideStrSimple = false;
        bool insideStrDouble = false;
        bool insideStrComment = false;
        for (int i = 0; i < index; ++i)
        {
            string subStr = text.Substring(i, 2);

            if (text[i] == '\'' && !insideStrDouble && !insideStrComment)
                insideStrSimple = !insideStrSimple;
            else if (text[i] == '"' && !insideStrSimple && !insideStrComment)
                insideStrDouble = !insideStrDouble;
            else if (text.Substring(i, 2) == "/*" && !insideStrDouble && !insideStrSimple)
                insideStrComment = true;
            else if (text.Substring(i, 2) == "*/" && insideStrComment)
                insideStrComment = false;
        }

        return insideStrDouble || insideStrSimple || insideStrComment;
    }

出力:

Before: .white> TD { color: white;box-shadow: 0px 0px 3px white, inset 0px 0px 5px black; white-space:pre-wrap;  background-image='white black \" white \"'}
After: .white> TD { color: green;box-shadow: 0px 0px 3px green, inset 0px 0px 5px black; white-space:pre-wrap;  background-image='white black \" white \"'}

編集:さて、行きます。内側の弦の問題も解決。これは、css プロパティを置き換えるために機能するはずです。再編集: コメントの修正を追加しました。

于 2013-05-19T18:06:50.383 に答える
1

正規表現を使用できます。これがあなたにとって最善の方法だと思います。より詳細な情報を入手できるリンクは次のとおりです。

http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx

正規表現のパターンを構築するのは得意ではありませんが、このサンプルを試すことができます

static void Main(string[] args)
{
    var inputText = @"white-space: 0; color: white;
                    box-shadow: 10px 20px  30px white, inset 0px 0px 5px black;";

    inputText = ChangeColor(inputText, "white", "#FFF");
}

private static string ChangeColor(string css, string oldColor, string newColor)
{
    // Rule 1
    var pattern1 = string.Format(@"(color)(\s*):(\s*){0}(\s*)", oldColor);
    var replacement = string.Format("$1 : {0}", newColor);

    var rgx = new Regex(pattern1);
    css = rgx.Replace(css, replacement);

    // Rule 2
    var pattern2 = string.Format(@"([\d]*)px(\s*)([\d]*)px(\s*)([\d]*)px(\s*){0}", oldColor);
    var replacement2 = string.Format("$1px $3px $5px {0}", newColor);

    rgx = new Regex(pattern2);
    css = rgx.Replace(css, replacement2);

    return css;
}
于 2013-05-19T16:00:46.853 に答える
0

whiteこれは、文字列を見つけて置き換える最も効率的な方法です#FFF

TheMinifedCSS = 
Regex.Replace(TheMinifiedCSS, @"(:(.*)(white)(.*);|:[ ]*(white)[ ]*})", @"#FFF");

間のスペースを次のように処理し{color: white} {color:white}ます。両方とも有効です。

詳細については、次のリンクを確認してください: http://regexr.com?34tqv

于 2013-05-19T16:38:21.323 に答える
0

シンプル...ほとんどの目的で機能するはずです:

TheMinifedCSS = Regex.Replace(TheMinifiedCSS, @":(.*)white(.*);", @":$1#FFF$2;")

基本的に、コロンの後にあるかどうかを確認し、すべての文字を白になるまで取得し、置換してからセミコロンの後にすべての文字を取得します。その後、css置換する新しいビットの周りにwhite( #FFF) を置き、その後にセミコロンを置きます。

于 2013-05-19T16:27:27.630 に答える
0

簡単なハックは、前にある場合にのみ置き換えることです:

TheMinifiedCSS = TheMinifiedCSS.Replace(": white", ":#FFF");

このようにして、プロパティではなく css 値のみを置き換えます。

ただし、私の意見では、最善の方法は、正規表現を使用するか、CSS パーサーを使用してドキュメントを完全に再構築することです。

ところで: 学習目的でこれを行っている場合は問題ありませんが、生産目的でこれを使用する場合は、これらすべてを既に行っている既存のコンポーネントを使用することを強くお勧めします。

于 2013-05-19T16:02:25.937 に答える