【问题标题】:Split a string (that contains tags) by spaces without breaking the tags or tag inner html in Javascript用空格分割一个字符串(包含标签)而不破坏Javascript中的标签或标签内部html
【发布时间】:2011-09-26 07:44:30
【问题描述】:

我正在尝试将字符串按空格拆分为单词数组。如果字符串包含 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

我在 Stack Overflow 上看到了几个相关的线程,但我无法将任何内容适应 Javascript,因为它们是为我不太熟悉的语言编写的。是否有一个正则表达式可以轻松做到这一点,或者解决方案是否需要多次正则表达式拆分和迭代?

谢谢。

【问题讨论】:

  • 可以有像&lt;div&gt; foo &lt;div&gt; bar &lt;/div&gt; baz &lt;/div&gt;这样的嵌套标签吗?

标签: javascript regex split


【解决方案1】:
result = subject.match(/<\s*(\w+\b)(?:(?!<\s*\/\s*\1\b)[\s\S])*<\s*\/\s*\1\s*>|\S+/g);

如果您的标签不能嵌套,如果所有标签都正确关闭,并且如果当前标签名称没有出现在 cmets、字符串等中,则将起作用。

说明:

<\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.

【讨论】:

  • 如果标签有属性,这会在中间分割标签。
  • @Rajesh:我不明白,你能举个例子吗?
  • 我想更正自己。这会破坏像 和
    等自闭合的 html 标签。测试链接:regex101.com/r/TU1NJ2/2
  • @Rajesh:是的,我明白了。我应该更新这个。在您的示例中,&lt;img&gt; 标记不是自封闭的(这在早期的 HTML 版本中似乎是标准的)。是否也应该考虑这种情况,或者我们是否应该期望&lt;img&gt; 标签是自动关闭的?如果是前者:还有其他类似的标签吗?
  • 我们不应该假设它们是自闭的。人们仍然使用
    标签而不关闭。所以,我能想到几个:link、br、img
【解决方案2】:

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

相反,迭代父节点的子节点,如果它们是文本节点,则将它们拆分,如果它们是非文本节点,则不加修改地打印它们。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多