2011-09-26 60 views
1

我试图将空格拆分为单词数组。如果字符串包含HTML标签,我希望完整标签(包括内容)被视为一个单词。用空格拆分包含标签的字符串(不包含标签)而不打破标签或标签中的内部html

例如,

I like to eat <a href="http://www.waffles.com/">tasty delicious waffles</a> for breakfast 

应该分成

I 
like 
to 
eat 
<a href="http://www.waffles.com/">tasty delicious waffles</a> 
for 
breakfast 

我见过的堆栈溢出了几个相关的线程,但我无法适应什么的Javascript,因为他们书面我不太熟悉的语言。有没有一个正则表达式可以很容易地做到这一点,或者解决方案是否需要多个正则表达式分割和迭代?

谢谢。

+0

是否可以嵌套标签,例如'

foo
bar
baz
'? –

回答

6
result = subject.match(/<\s*(\w+\b)(?:(?!<\s*\/\s*\1\b)[\s\S])*<\s*\/\s*\1\s*>|\S+/g); 

会工作,如果你的标签不能嵌套,如果所有的标签都完全关闭,如果目前的标签名称不评论出现,字符串等

说明:

<\s*   # Either match a < (+ optional whitespace) 
(\w+\b)   # tag name 
(?:    # Then match... 
(?!   # (as long as it's impossible to match... 
    <\s*\/\s*\1\b # the closing tag here 
)    # End of negative lookahead) 
[\s\S]   # ...any character 
)*    # zero or more times. 
<\s*\/\s*\1\s*> # Then match the closing tag. 
|    # OR: 
\S+    # Match a run of non-whitespace characters. 
1

单独使用正则表达式很难或不可能完成(取决于您希望/需要允许的HTML复杂性)。

取而代之,遍历父节点的子节点,如果它们是文本节点,则将其拆分,如果它们是非文本节点,则将它们未经修改地打印出来。