2013-04-26 43 views
0

有一个很好的方法in this answer用于将span添加到页面中的每个数字。向第n位数字添加类

var regex = /(\d+)/, 
    replacement = '<span>$1</span>'; 

function replaceText(el) { 
    if (el.nodeType === 3) { 
     if (regex.test(el.data)) { 
      var temp_div = document.createElement('div'); 
      temp_div.innerHTML = el.data.replace(regex, replacement); 
      var nodes = temp_div.childNodes; 
      while (nodes[0]) { 
       el.parentNode.insertBefore(nodes[0],el); 
      } 
      el.parentNode.removeChild(el); 
     } 
    } else if (el.nodeType === 1) { 
     for (var i = 0; i < el.childNodes.length; i++) { 
      replaceText(el.childNodes[i]); 
     } 
    } 
} 

replaceText(document.body); 

是否可以将span添加到数字的每第三个数字?我的意思是,没有使用Lettering.js。

编辑

@ thg435已经回答了这个问题,但我dicovered,他的第二个正则表达式/\d(?=\d\d(\d{3})*\b不上阿拉伯数字,这我正在工作。 (阿拉伯数字从“0”开始到“9”,并且可以在正则表达式中作为[0-9])。问题可能出在\b在第二个正则表达式的末尾。

此外,作为我正在尝试/希望实现的一个示例,١٢٣٤应该变成١<span>٢</span>٣٤

回答

1

如果我理解正确

html = text.replace(/(\d\d)(\d)/g, function($0, $1, $2) { 
     return $1 + "<span>" + $2 + "</span>" }) 

这将替换从右边每三个数字:

> a = "foo 1234567890 bbb 123456" 
"foo 1234567890 bbb 123456" 
> a.replace(/\d(?=\d\d(\d{3})*\b)/g, "[$&]") 
"foo 1[2]34[5]67[8]90 bbb [1]23[4]56" 

对于阿拉伯数字考虑:

String.prototype.reverse = function() { return this.split("").reverse().join("") } 
result = str.replace(/[\u0660-\u0669]+/g, function(s) { 
    return s. 
     reverse(). 
     replace(/(..)(.)/g, "$1aaa$2zzz"). 
     reverse(). 
     replace(/zzz(.)aaa/g, "<span>$1</span>") 
}) 

这是相当麻烦的,但似乎工作:http://jsfiddle.net/VSTJs/2/

+0

谢谢,尤其是正则表达式。但是,正如我所提到的,这是处理数字,所以应该从右侧选择数字。任何想法? – Iryn 2013-04-26 07:53:51

+0

@Iryn:已更新。 – georg 2013-04-26 08:05:34

+0

你已经回答了这个问题,所以我会把它标记为答案。只有一个缺点:我不是在处理英文数字,​​而是阿拉伯数字,而且似乎这个正则表达式不适用于他们。你介意告诉我该怎么处理?字符范围是[0-9]。 – Iryn 2013-04-26 09:10:51