2013-09-20 45 views
0

此刻,我正在處理分解爲浮動列的文本,以magazine-like的方式顯示它。在javascript中將字符串拆分爲單詞

我問一個previous question如何split文成句子,它就像一個魅力:

sentences = text.replace(/\.\s+/g,'.|').replace(/\?\s/g,'?|').replace(/\!\s/g,'!|').split("|"); 

現在我想走得更遠一步,它拆分成詞。但我也有一些元素,不應該被分割。像小標題一樣。

一個例子文字是:

A wonderful serenity has taken possession of my entire soul. <strong>This is a subheadline</strong><br><br>I am alone, and feel the charm of existence in this spot. 

我想要的結果看起來就會像下面這樣:

Array [ 
    "A", 
    "wonderful", 
    "serenity", 
    "has", 
    "taken", 
    "possession", 
    "of", 
    "my", 
    "entire", 
    "soul.", 
    "<strong>This is a subheadline</strong>", 
    "<br>", 
    "<br>", 
    "I", 
    "am", 
    "alone,", 
    "and", 
    "feel", 
    "the", 
    "charm", 
    "of", 
    "existence", 
    "in", 
    "this", 
    "spot." 
] 

當我分裂,在所有的空格,我做得到的話,但"<br>"贏得」不要添加爲新的數組條目。我也不想拆分子標題和標記。

我之所以要這麼做,是因爲我在序列之後添加序列到p標籤,當高度比周圍元素大時,我刪除最後添加的序列並創建一個新的浮動p標籤。當我把它分解成我看到的句子時,分手不夠好,以確保良好的閱讀流程。

一個例子是我努力實現你可以看到here

如果您需要任何進一步的信息,我會很樂意給你。

由於提前,

托比亞斯

編輯

的字符串可以包含在未來更多的HTML標籤。有沒有辦法不接觸這些標籤之間的任何東西?

EDIT 2

我創建了一個的jsfiddle:http://jsfiddle.net/m9r9q/1/

編輯3

難道是一個好主意,刪除所有html標籤與封裝的文本,並用佔位符代替它呢?然後將字符串拆分爲單詞,並在到達佔位符時添加未觸及的html標籤?提取所有html標籤的正則表達式是什麼?

+0

你能否把一個硬編碼的例外這種情況呢? – Jake

+0

@Jake:你見過我的[示例](http://ol.tobiaskun.com/text.html)嗎?如果不能幫助你理解我想實現的目標嗎?但不過我會創建一個jsfiddle :) –

+1

看到了這個例子,它只是我們不能修改代碼:) – Jake

回答

2

雖然我想嘗試提取的HTML部分,並將它們添加 後來不變

忘掉它,並約我以前的帖子添加此功能。 我剛剛有一個想法,它使用內置的瀏覽器引擎來操作HTML代碼更好。

你可以使用這個:

var text = 'A wonderful serenity has taken possession of my entire soul. <strong>This is a subheadline</strong><br><br>I am alone, and feel the charm of existence in this spot.';  

var elem = document.createElement('div'); 
elem.innerHTML = text; 

var array = []; 

for(var i = 0, childs = elem.childNodes; i < childs.length; i ++) { 
    if (childs[i].nodeType === 3 /* document.TEXT_NODE */) { 
    array = array.concat(childs[i].nodeValue.trim().split(/\s+/)); 
    } else { 
    array.push(childs[i].outerHTML); 
    } 
} 

它不支持嵌套的標籤這個時候,還支持所有可能的語法,而不對非關閉的標籤:)

+0

這真棒。非常感謝你! –

3

正如我在之前所說的評論 - 你不應該這樣做。但如果你堅持 - 這是一個可能的答案:

var text = 'A wonderful serenity has taken possession of my entire soul. <strong>This is a subheadline</strong><br><br>I am alone, and feel the charm of existence in this spot.'; 

var array = [], 
    tagOpened = false, 
    stringBuilder = []; 

text.replace(/(<([^\s>]*)[^>]*>|\b[^\s<]*)\s*/g, function(all, word, tag) { 
    if (tag) { 
    var closing = tag[0] == '/'; 
    if (closing) { 
     stringBuilder.push(all); 
     word = stringBuilder.join(''); 
     stringBuilder = []; 
     tagOpened = false; 
    } else { 
     tagOpened = tag.toLowerCase() != 'br'; 
    } 
    } 
    if (tagOpened) { 
    stringBuilder.push(all); 
    } else { 
    array.push(word); 
    } 
    return ''; 
}); 

if (stringBuilder.length) array.push(stringBuilder.join('')); 

它不支持嵌套標籤。您可以通過實現一個棧爲您打開標籤

+0

非常感謝!這像一個魅力。雖然我想嘗試提取HTML部分,並將其添加後未觸及這是一個非常好的解決方案:) –