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美元
总额为$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)
});