RegExp"g"标志不替换每个实例

Mat*_*hew 2 javascript regex replace function

我正在研究EM到PX转换器.基本上你将代码粘贴到"PX"textarea中,然后相同的代码将出现在带有em值的"EM"textarea中.它有点工作,但不会取代所有实例的价值.例如:如果键入"padding:5px;" 它会给你"填充:0.313em;" 成功.但是......如果你输入"padding:5px 4px;" 它只将"px"替换为"em"而不是实际的数字值.

在这里尝试一下:: http://jsfiddle.net/tJsNz/

        function pxToEm(){
        var px = document.getElementById("px"),
            em = document.getElementById("em"),
            parent = document.getElementById("parent-font-size");

        var pxVal = px.value.match(/\d+/ig);
        var pxToEm = 1 / parent.value * pxVal;
        var pxToEmFixed = pxToEm.toFixed(3);
        var pxToEmAnswer = px.value.replace(pxVal, pxToEmFixed).replace(/px/ig, "em");

        em.value = pxToEmAnswer;
    }
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 6

考虑使用.replace带有回调函数.我想这就是你想要的 - 找到每一场比赛并根据它进行替换.

String的.replace方法可以接受回调作为第二个参数,并在每次匹配时运行该回调.您可以运行它并匹配所有数字,然后用它们的翻译值替换它们.

更简单的例子

var i=0;
"aaaaaa".replace(/a/g,function(match){
    return i++;
});
Run Code Online (Sandbox Code Playgroud)

会回来"012345".这是MDN的另一个例子

在你的情况下像:

var pxToEmAnswer = px.value.replace(/\d+/ig, function(match){
    return 1 / parent.value * match;
}).replace(/px/ig, "em");
Run Code Online (Sandbox Code Playgroud)

(小提琴)

  • 这是一个很好的解决方案 - 但我建议以下内容以避免替换未跟随"px"的数字:`var pxToEmAnswer = px.value.replace(/(\ d +)px/ig,function(match,size){ return(1/parent.value*size).toFixed(3)+"em"});` (2认同)