Поиск текста цен, выполнение функции и замена на выход

Я хочу иметь возможность находить текст цен на заданной странице, который соответствует регулярному выражению, выполнять на нем функцию, а затем заменять вывод.

Пример:

<div>The total is $12</div>
  • RegEx соответствует текстовому тексту $12
  • Возьмите 12 и умножьте их на 2, которые = 24
  • Замените 12 с помощью 24

Становится: <div>The total is $24</div>

Вот JSFiddle с моим тестовым кодом (Пожалуйста, не забудьте указать мои вопросы выше, за то, что я хочу, спасибо!)

Вот regEx, который я использую

Ответ 1

Во-первых, ваше регулярное выражение имеет недостатки. Его можно устранить и упростить:

/\$([\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 - первая группа захвата, которая является просто числом без знака доллара. Он анализировался как плавающий, а затем удвоился. Если в исходной строке был знак доллара, перед этим номером стоит знак доллара. Если были запятые, они должны быть удалены и повторно добавлены после удвоения числа. После всего этого все вернулось.

Вот пример jsfiddle, чтобы вы могли видеть его в действии: http://jsfiddle.net/dB8bK/49/

Ответ 2

Попытайтесь узнать, является ли это то, что вы ищете помощника.

В принципе, я просто изменил вашу функцию replace на

document.body.innerHTML = pageText.replace(/12/g, 'IT WORKS!!!!!!!!!!!');

Так как просто

document.body.innerHTML = pageText.replace('12', 'IT WORKS!!!!!!!!!!!');

заменит только первое появление "12".

Демо

Ответ 3

Это нужно сделать для вас:

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>

Пример вывода:

$24
$29.98
$4
$dollars
14.99
$24,000
$12,00,0
$0,018

Примечание:, если вам нужно, вы можете отрегулировать регулярное выражение, изменив часть (?=\D\D).

Ответ 4

Вам не нужно использовать regex. возьмите цену внутри span и добавьте класс к этому диапазону. Поскольку span является встроенным элементом, это не повредит html-дизайну.

Я думаю, что это будет лучший подход, чем regex

попробуйте вот так:

HTML:

<div>The total is $<span class="price">12</span></div>

<div>The total is $<span class="price">100</span></div>

Jquery:

 $('.price').each(function(i,e){
      $(this).text(parseFloat($(this).text()*2));
  });

fiddle

Ответ 5

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);

JSFiddle Demo

Теоретически $ может быть заменен любым символом валюты, который предшествует его значению и значение которого использует . как десятичный разделитель.

Обратите внимание, что используемое здесь регулярное выражение будет соответствовать только числам, которым предшествует знак доллара (например, 14.25 не будет сопоставлен)

Ответ 6

(function(context){
  var pattern=/(\$)(\d([\d\,\.]+)?)/g,
      callback=function(_,dollar,price){
           price=price.replace(/,/g,''); 
           return dollar + parseFloat(price)*2;
      },
      html=context.innerHTML.replace(pattern,callback);
  context.innerHTML=html;
})(document.body);

, если вам не нужно переформатировать цены ckeck the fiddle

Ответ 7

Сначала создайте регулярное выражение.

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)
});

Хотя были и другие ответы, чтобы выполнить то, что вы хотели, мой ответ суммирует его, чтобы сделать это так, как вы хотели это сделать.