2013-04-26 42 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