Javascript 搜索价格文本,执行函数,并替换为输出

Javascript 搜索价格文本,执行函数,并替换为输出,javascript,jquery,regex,replace,Javascript,Jquery,Regex,Replace,我希望能够在给定页面上找到与正则表达式匹配的价格文本,对其执行函数,然后替换输出 例如: <div>The total is $12</div> 总共是12美元 正则表达式与$12价格文本匹配 取12乘以2,即=24 将12替换为24 变成:总额为$24 这里是一个(请务必参考我上面的问题,了解我想要什么,谢谢!) 这是你想要的,看看这是否就是你想要的伴侣 基本上,我只是将您的replace函数更改为 document.body.innerHTML = pageTex

我希望能够在给定页面上找到与正则表达式匹配的价格文本,对其执行函数,然后替换输出

例如:

<div>The total is $12</div>
总共是12美元
  • 正则表达式与$12价格文本匹配
  • 取12乘以2,即=24
  • 将12替换为24
  • 变成:
    总额为$24

    这里是一个(请务必参考我上面的问题,了解我想要什么,谢谢!)


    这是你想要的,看看这是否就是你想要的伴侣

    基本上,我只是将您的
    replace
    函数更改为

    document.body.innerHTML = pageText.replace(/12/g, 'IT WORKS!!!!!!!!!!!');
    
    因为刚刚做了

    document.body.innerHTML = pageText.replace('12', 'IT WORKS!!!!!!!!!!!');
    
    将仅替换第一次出现的“12”


    您不需要使用
    regex
    。 在
    span
    中获取价格,并在此span中添加一个类。因为span是内联元素,所以它不会影响html设计

    我认为它比
    regEx

    试着这样做:

    pageText.replace(/\$([\d,]+(?:\.\d+)?)/g,
    function (string, c1) {
        //If there are commas, get rid of them and record they were there
        var comma = c1.indexOf(',') != -1;
        c1 = c1.replace(/,/g, '');
        //Parse and double
        var value = '' + (parseFloat(c1) * 2);
        //Reinsert commas if they were there before
        if (comma) {
            var split = value.split(".");
            value = split[0].replace(/(\d)(?=(\d{3})+$)/g, "$1,");
            if(split.length > 1)
                value += "."+split[1];
        }
        //Return with dollar sign prepended
        return '$' + value;
    });
    
    html:


    首先,您的正则表达式有缺陷。可以将其固定并简化为:

    /\$([\d,]+(?:\.\d+)?)/g
    
    它的设计使得第一个捕获组将是没有美元符号的数字本身。它查找可选的美元符号,后跟至少一个数字,后跟可选的句点,如果有句点,则后跟更多的数字

    然后,您可以在replace函数中使用它。要使其加倍,必须传递一个函数作为执行加倍的第二个参数。这看起来像这样:

    pageText.replace(/\$([\d,]+(?:\.\d+)?)/g,
    function (string, c1) {
        //If there are commas, get rid of them and record they were there
        var comma = c1.indexOf(',') != -1;
        c1 = c1.replace(/,/g, '');
        //Parse and double
        var value = '' + (parseFloat(c1) * 2);
        //Reinsert commas if they were there before
        if (comma) {
            var split = value.split(".");
            value = split[0].replace(/(\d)(?=(\d{3})+$)/g, "$1,");
            if(split.length > 1)
                value += "."+split[1];
        }
        //Return with dollar sign prepended
        return '$' + value;
    });
    
    c1是第一个捕获组,它只是没有美元符号的数字。它被解析为浮点数,然后加倍。如果原始字符串中有一个美元符号,则该数字前面会有一个美元符号。如果有逗号,则必须在数字翻倍后删除并重新添加。在这一切之后,一切都回来了


    下面是一个示例JSFIDLE,您可以看到它的实际作用:

    这一个应该适合您:

    document.body.innerHTML = pageText.replace(/\$\d+([.,]\d+)?(?=\D\D)/g, function (match) {
        // getting digits only
        digits = match.replace(/\D/g, "");
        num = "" + digits * 2;
    
        // handle input: $0.009
        if(digits.match(/^0+/)){
            // left padding
            num = Array(digits.length - String(num * 2).length+1).join('0') + num;
        }
    
        pos_dot = match.indexOf(".");
        if(pos_dot >= 0){
            pos_dot = match.length - pos_dot - 1;
            num = num.substring(0, num.length - pos_dot) + "." + num.substring(num.length - pos_dot, num.length);
    
        }
    
        pos_comma = match.indexOf(",");
        if(pos_comma >= 0){
            pos_comma = match.length - pos_comma - 1;
            num = num.substring(0, num.length - pos_comma) + "," + num.substring(num.length - pos_comma, num.length);
        }
    
        return "$"+num;
    });
    
    样本输入:

    <li>$12</li>
    <li>$14.99</li>
    <li>$2</li>
    <li>$dollars</li>
    <li>14.99</li>
    <li>$12,000</li>
    <li>$12,00,0</li>
    <li>$0,009</li>
    
    注意:如果需要,可以通过更改
    (?=\D\D)
    部分来调整正则表达式

    function dollarChange(match, p0, p1, p2, offset, string) {
        // pN = Nth in-parentheses match
    
        // Remove commas (reinjected later)
        var hasComma = (p1.indexOf(',') > -1);
        if (hasComma) p1 = p1.replace(',', '');
    
        // Get decimal precision
        var precision = 0;
        if (p2) {
            p1 = p1 + p2;
            precision = p2.length - 1;
        }
    
        // Process number
        p1 = Number(p1);
        var value = p0 + (p1 * 2).toFixed(precision);
    
        // Inject commas if previously found
        if (hasComma) {
            var parts = value.toString().split('.');
            parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            value = parts.join('.');
        }
    
        return value;
    }
    
    // Execute replacement
    document.body.innerHTML =
        document.body.innerHTML.replace(/([$])([\d,]+)(\.[\d]+)?/g,
                                        dollarChange);
    

    从理论上讲,
    $
    可以被其值之前的任何货币符号替换,并且其值使用
    作为十进制分隔符

    请注意,此处使用的正则表达式仅与前面带有美元符号的数字匹配(例如,
    14.25
    将不匹配)


    如果您不关心价格重新格式化,请首先生成正则表达式

    var reg_exp = /\$[0-9]*\.?[0-9]*/g;  //This is your Custom Requested Regex 
    
    var matches = document.body.innerHTML.match(reg_exp)
    
    生成与正则表达式匹配的字符串列表

    var reg_exp = /\$[0-9]*\.?[0-9]*/g;  //This is your Custom Requested Regex 
    
    var matches = document.body.innerHTML.match(reg_exp)
    
    假设您希望在HTML的整个主体上搜索正则表达式

    定义转换函数

    var transform = function(match){
        var result;
        /* Logic for genarting the resulting string, populate it in result */
        result = match.replace('$','');
        result = parseFloat(result);
        result = result * 2;
        result = '$' + result;
        return result;
    };
    
    将每个匹配项转换为它们的结果

    matches.forEach(function(match){
        console.log(match)
        result = transform(match);
        document.body.innerHTML.replace(match, result)
    });
    

    虽然还有其他答案可以满足您的要求,但我的答案总结了您想要的方法

    您知道如何获得12吗?您不应该将这些字符串值解析为数字,这很容易出错。而是将数据放在某种对象中,并根据该数据更新html内容。然后,您将以数字的形式清晰地表示数据\是的,根据我上面的解释,我想解析为正则表达式。人们似乎被我失望地停下来的地方分心了(只是想得到一个简单的字符串)@jonshariat在上面的提琴中,你是想只换12美元还是12000美元。如果我不想,你想html中的每一个价格都翻倍?为了解释这一点,正则表达式上附加的
    g
    是一个
    global
    标志,这意味着它应该在第一次匹配后继续匹配。嘿@kuna谢谢你的回复。很抱歉,我没有说得更清楚,JS fiddle是我离开的地方(只是搜索一个文本),但根据我上面的解释:我正在尝试搜索RegE(也在上面链接),然后执行一个函数,然后替换它。好的,如果您知道要替换12,那么您可以执行
    document.body.innerHTML=pageText.replace(/12/g,doSomething(12));
    。我希望我理解了您的问题和目标。向原始问题中演示的值添加$将返回NaN@BentOnCoding当前位置我在跨度之外增加了美元,而不是在价格中。仔细看一下,我认为这是最好的答案:)谢谢,这就是我要找的。唯一的想法是它不能处理像12000000.99这样的大数字,但我可以计算出这一部分。非常感谢。嘿,有几件事我不明白。1.My将成为代码2中的一个。为什么使用ParseFloat?为什么不把它作为注册号呢?12000000.99不起作用的原因是,在您的示例中,您希望使用逗号作为小数的数字仍然加倍。所以正则表达式认为12000000.99是一个包含多个小数的数字。@jonshariat我编辑了它,这样逗号就可以工作了。此外,要修复标题,必须使其具有美元符号,否则正则表达式将匹配标记中的数字。我还补充了这一点,不过如果您愿意,可以通过在正则表达式中选择美元符号来删除它。
    matches.forEach(function(match){
        console.log(match)
        result = transform(match);
        document.body.innerHTML.replace(match, result)
    });