【问题标题】:Change some contents of an existing file without deleting the other contents in the file in node js更改现有文件的某些内容而不删除节点js中文件中的其他内容
【发布时间】:2015-08-27 18:03:27
【问题描述】:

我的目标是改变颜色

.made-easy-theme{
            color:black
        }

在具有另一种颜色的 css 文件中。但是当我使用 fs.writeFile 更改颜色时,它会删除 css 文件中的所有其他内容并仅替换

.made-easy-theme{
            color:black
        }

在更改颜色之前,css 文件包含以下内容,

@charset "utf-8";
        @import url(http://fonts.googleapis.com/css?family=Lato:300,400,700);
        @import url(http://weloveiconfonts.com/api/?family=entypo);
        /* entypo */
        [class*="entypo-"]:before {
          font-family: 'entypo', sans-serif;
        }
        .made-easy-theme{
            color:black
        }

        * {
          box-sizing: border-box;
        }

        .toggler {
          color: #A1A1A4;
          font-size: 1.25em;
          margin-left: 8px;
          text-align: center;
          cursor: pointer;
        }
        .toggler.active {
          color: #000;
        }

        .cardss {
          list-style: none;
          padding-right: 10px;
          padding-left: 10px;
          text-align: left;
          -webkit-overflow-scrolling: touch;
          max-width: 100%;
          -webkit-backface-visibility: hidden;
        }

但改变颜色后它只包含,

.made-easy-theme{color:hsl(0, 22%, 51%)}

hsl(0, 22%, 51%)(我从客户端收到的颜色)。 下面是我的 js 文件,其中包含更改 css 文件的代码,

var main = 'temp/' + userId + '/templates/' + appId + '/css/main.css';
 var color = req.body.color;
function replaceThemecolor(color) {

        fs.readFile(main, 'utf-8',
            function (err, data) {
                var searchStr = ".made-easy-theme{color:black}";

                    console.log(searchStr);

                    var result = searchStr.replace(new RegExp('black', ''), color);
                    fs.writeFile(main, result, 'utf-8', function (err) {
                        console.log("kk");
                        console.log(color);
                        console.log(result);
                        if (err) return console.log(err);
                    });
            });

    }

我认为问题出在 fs.writeFile 方法上。我不知道如何获得正确的输出。

【问题讨论】:

    标签: regex angularjs node.js fs


    【解决方案1】:

    您当前的代码存在多个问题:

    1. 您正在读取文件内容,但没有对其进行任何操作。您只是对静态字符串进行替换,因此它忽略了原始文件内容。

    2. 您的正则表达式只寻找与文件中任何位置匹配的黑色,并且在您更改它后不会匹配。

    我认为您想要这样的东西,使正则表达式仅匹配该规则中的颜色。您可以根据需要使正则表达式变得复杂。我在这里展示的内容足够灵活,可以支持.made-easy-theme 规则中的其他样式。它只会选择 color 规则进行更改。它假定颜色由名称指定,例如“黑色”。

    var main = 'temp/' + userId + '/templates/' + appId + '/css/main.css';
    var color = req.body.color;
    
    function replaceThemecolor(color) {
        fs.readFile(main, 'utf-8', function (err, data) {
            var regex = /(\.made-easy-theme\s*{[^}]*color\s*:\s*)([^\n;}]+)([\s*;}])/;
            var result = data.replace(regex, "$1" + color + "$3");
            console.log(result);
            console.log(color);
            fs.writeFile(main, result, 'utf-8', function (err) {
                if (err) return console.log(err);
            });
        });
    }
    

    这是一个没有实际文件操作的文本块的工作演示:http://jsfiddle.net/jfriend00/e6923rqe/

    【讨论】:

    • 我已经这样做了,并且正在工作,但是发生了一些冲突。当尝试替换颜色两次它不会覆盖时,结果就像 .made-easy-theme{ color:hsl(0, 44%, 45%)(0, 26%, 55%); } 并且当我尝试替换字体系列等其他变量时,它根本不起作用
    • @adithya - 它在我的回答中说该解决方案仅适用于由“黑色”等名称指定的颜色。你没有要求更多。如果您希望hsl(...) 颜色或rgb(...) 颜色工作,则必须更改正则表达式。使用正确的正则表达式,它也适用于字体系列。如果您可以保证颜色值以; 结尾,那么制作正则表达式会容易得多。
    • 你能给我一个链接,帮助我根据我的要求更改我的正则表达式
    • @adithya - 我不知道你的要求是什么。你的问题没有具体说明。我使它与您展示的示例一起使用。如果你能保证颜色后面总是有一个分号,那就很容易了。如果不是这种情况就不那么容易了,因为颜色值有多种不同的格式,这对于正则表达式来说并不容易。您可以找到许多记录正则表达式语法的网站,但需要学习如何使用它来修改。我不确定你想要什么样的链接。
    • 我想在用户更改颜色时替换颜色,尽管我在您给出的答案中将颜色属性更改为字体大小,但它不适用于字体大小
    【解决方案2】:

    让我们看看这一行:

    var result = searchStr.replace(new RegExp('black', ''), color);
    

    result 变量的范围缩小为仅替换模式within searchStr,最初声明为:

    var searchStr = ".made-easy-theme{color:black}";
    

    所以在fs.writeFile 中,result 然后被写入文件。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2013-12-26
      • 2016-07-11
      • 2011-05-16
      • 1970-01-01
      • 2017-05-04
      相关资源
      最近更新 更多