2013-09-23 45 views
2

如何使用JavaScript分割極長單詞?我不是在尋找像word-break: break-all這樣的CSS解決方案。我們的目標是用長字插入空格將它們分成更小的片段。解決方案應該儘可能快,因爲它會在幾秒鐘內被調用幾千次。將長單詞拼成等長文字

例的解決方案應該是如何工作的:

splitString("This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxample string."); 
=> This is an exxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxample string. 

splitString("AnotherExammmmmmmmmmmpleeeeeeeeeeeeeeeee"); 
=> AnotherExammmmmm mmmmmpleeeeeee eeeeeeeeee 

過長被分成一個空格字符的任何話。

如果生成的碎片長度大致相等,效果會更好。

+3

你需要澄清你想要的。每條線的長度完全相同? '太長'在沒有語境的情況下是毫無意義的 – Wyatt

+0

要清楚,你只想將*字*分成長度超過一定的長度,而對總長或線的長度毫不在意? – user113215

+0

@ user113215是的,這就是我需要的。 – David

回答

2

既然你問的表現,我比較了正則表達式方法:

function splitString(str, length) { 
    var regex = new RegExp("/(\w{" + length + "})(?=\w)/g"); 
    return str.replace(regex, "$1 "); 
} 

與此相對簡單手工解決方案:

function splitString(str, length) { 
    var words = str.split(" "); 
    for (var j = 0; j < words.length; j++) { 
     var l = words[j].length; 
     if (l > length) { 
      var result = [], i = 0; 
      while (i < l) { 
       result.push(words[j].substr(i, length)) 
       i += length; 
      } 
      words[j] = result.join(" "); 
     } 
    } 
    return words.join(" "); 
} 

JsPerf說我的機器上的正則表達式版本大約快了8%(Mac Op era16)。由於這也更加簡潔,我會爲此而努力。

+0

heh用連接改寫單詞[j]比我用拼接的方式好得多。好一個。 –

+1

此外,在使用Chrome(win 8 64位)的性能說明中,正則表達式實際上比手工製作要慢。 –

+1

如果'length'是固定的或只需要幾個值,當然你會想要編譯正則表達式而不是每次調用。假設您不止一次使用該函數,這可以提高性能。 – user113215

1

雖然這並沒有確保碎片的長度相同,但它會確保字符串中的單詞不超過40個字符。

'This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxample string.' 
    .replace(/(\w{40})(?=\w)/g, '$1 '); 

>> 'This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xample string.' 

「word」在這裏定義爲字母,數字和下劃線的連續字符串。如果您希望應用「單詞」的不同定義(例如,如果您的「單詞」可以包含Unicode字符),則需要將\w替換爲您所選的字符類。

+0

這個解決方案是否對Unicode友好? – David

+1

'\ w'匹配字母,數字和下劃線(相當於'[A-Za-z0-9_]')。它將保持Unicode字符原樣。 – user113215

0

這就是我想出了:

http://jsfiddle.net/KyleMuir/czBZz/

function splitString(value) { 
    var tooLongDeterminer = 12; 
    var words = value.split(' '); 
    for (var i = words.length - 1; i >= 0; i--) { 
     if (words[i].length > tooLongDeterminer) { 
      var split = words[i]; 
      var tempArray = new Array(); 
      while (split != '') { 
       var word = splitWord(split, tooLongDeterminer); 
       tempArray.push(word); 
       split = split.replace(word, ''); 
      } 

      words.splice(i, 1, tempArray.join(' ')); 
     } 
    } 
    return words.join(' '); 

} 

function splitWord(word, length) { 
    return word.substring(0, length); 
} 

console.log(splitString("This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxample string.")); 

console.log(splitString("AnotherExammmmmmmmmmmpleeeeeeeeeeeeeeeee")); 

注:這是遞歸的(且僅在Chrome測試),可能會或可能不會從上面的控制檯滿足您的要求,但輸出.logs如下:

AnotherExamm mmmmmmmmmple eeeeeeeeeeee eeee

This is an exxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxample string.

希望這有助於和感謝的挑戰:)