2013-09-20 41 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部分,并将其添加后未触及这是一个非常好的解决方案:) –