2014-09-12 74 views
2

我有一個HTML格式的字符串,我需要將所有數學指數以HTML格式<sup></sup>替換爲不含HTML格式的數學指數。我使用replace()方法,但我需要找到並替換100個指數,從<sup>1</sup><sup>100</sup>,我應該寫所有數字(從1到100)。自動化替換JavaScript中的大量內容字符串

var copiar = texto. 
       replace(/<br>/g, "\n"). 
       replace(/<sup><\/sup>/g, ""). 
       replace(/<sup>2<\/sup>/g, "²"). 
       replace(/<sup>3<\/sup>/g, "³"). 
       replace(/<sup>4<\/sup>/g, "⁴"). 
       replace(/<sup>5<\/sup>/g, "⁵"). 
       replace(/<sup>6<\/sup>/g, "⁶"). 
       replace(/<sup>7<\/sup>/g, "⁷"). 
       replace(/<sup>8<\/sup>/g, "⁸"). 
       replace(/<sup>9<\/sup>/g, "⁹"). 
       replace(/<sup>10<\/sup>/g, "¹⁰"); 
       ... 
       replace(/<sup>100<\/sup>/g, "¹⁰⁰"); 

我的問題是:有一種方法來自動完成這個任務嗎?謝謝!

UPDATE:我正在做這個替換,因爲我正在開發iOS應用程序,能夠打印(以HTML格式)並複製到剪貼板(平面文本)。這是因爲我正在更換<sup>號碼。

UPDATE 14/Oct/2014:我也需要替換負指數。使用@minitech答案並修改一下,我可以取代所有指數(正數和負數)。也許可以爲一個人是有用的,這裏的代碼:

var map = '⁰¹²³⁴⁵⁶⁷⁸⁹'; 

var copiar = texto.replace(/<sup>(\-*(\d*))<\/sup>/g, function (str, digits){ 
    return Array.prototype.map.call(digits, function (digit) { 
     var exp = ""; 

     if (digit != '-') { 
      exp += map.charAt(digit); 
     } else { 
      exp += "¯"; 
     } 
     return exp; 
    }).join(''); 
}); 
+0

儘管如此,以純文本格式複製到剪貼板可能會更好地完成爲'x^100'而不是'x¹⁰⁰'。我不知道你的字體,但它看起來不好我的... – Ryan 2014-09-13 00:32:00

+0

感謝您的評論@minitech,但這是我開始我的應用程序的方式,但我如何管理大型數學表達式它看起來不那麼明確。所以我決定改變這種方式'x¹⁰⁰'。 – 2014-09-13 01:37:00

回答

5

的字符串和charAt提供一個便捷的方式爲數字映射到相應的標位:

var map = '⁰¹²³⁴⁵⁶⁷⁸⁹'; 

var copiar = texto.replace(/<sup>(\d*)<\/sup>/g, function (_, digits) { 
    return Array.prototype.map.call(digits, function (digit) { 
     return map.charAt(+digit); 
    }).join(''); 
}); 
+0

你的方式比我的更好,它不需要硬編碼的Unicode代碼點。但我學到了一些寫我的東西:) – Barmar 2014-09-13 00:17:05

+0

非常感謝!這真的解決了它,乾淨而精彩!你真的很棒! ;) – 2014-09-13 02:04:58

+0

@minitech有一種方法來取代負數?其實我需要這個,但我不太瞭解regExpr。希望你能幫助我! – 2014-10-14 16:06:49

0
<script> 
function get_sup_index(num) { 
    var new_num = new String(num); 
    new_num = new_num.replace(/0/g, "⁰"). 
         replace(/1/g, "¹"). 
         replace(/2/g, "²"). 
         replace(/3/g, "³"). 
         replace(/4/g, "⁴"). 
         replace(/5/g, "⁵"). 
         replace(/6/g, "⁶"). 
         replace(/7/g, "⁷"). 
         replace(/8/g, "⁸"). 
         replace(/9/g, "⁹");  
    return new_num; 
} 

var my_text = '<sup>1</sup>'+ 
       '<sup>2</sup>'+ 
       '<sup>3</sup>'+ 
       '<sup>4</sup>'+ 
       '<sup>5</sup>'+ 
       '<sup>6</sup>'+ 
       '<sup>7</sup>'+ 
       '<sup>8</sup>'+ 
       '<sup>9</sup>'+ 
       '<sup>10</sup>'; 

alert(get_sup_index(my_text.replace(/<sup>([0-9]*)<\/sup>/g, "\$1"))); 
</script> 

我希望能幫助你。

+0

我正在做這個「轉換」,因爲我正在爲iOS開發一個應用程序,並有可能打印並複製到剪貼板。對於打印在HTML中執行,但要複製它做飛機。這就是原因。 – 2014-09-13 00:08:04

+0

我編輯了我的答案,我不知道您是否會收到通知。我正在寫信給你,以防萬一。 – 2014-09-13 00:21:52

2

當你做了更換,您可以提供一個函數來計算的話,而不是一個固定的字符串。因此,您可以使用所有<sup>替換的模式,並使用將該數字轉換爲Unicode上標的函數。

var copiar = texto. 
    replace(/<br>|<sup>(\d*)<\/sup>/g, function(match, digits) { 
    if (match == "<br>") { 
     return "\n"; 
    } 
    // Rest is for translating superscripts to Unicode 
    var superdigits = ''; 
    var zero = "0".charCodeAt(0); 
    var superzero = 0x2070; 
    var supertwo = 0x00b2; 
    for (var i = 0; i < digits.length; i++) { 
     var n = digits.charCodeAt(i) - zero; 
     var char; 
     switch (n) { 
      // Superscripts 2 and 3 are at weird places in Unicode 
      case 2: case 3: 
       char = String.fromCharCode(n - 2 + supertwo); 
       break; 
      default: 
       char = String.fromCharCode(n + superzero); 
     } 
     superdigits += char; 
    } 
    return superdigits; 
}); 
+0

感謝您的回答,但我選擇minitech的答案,因爲更清潔和更短。無論如何,謝謝你! – 2014-09-13 02:06:37

+0

我更喜歡他的回答,我向他投了贊。 – Barmar 2014-09-13 02:07:26