【问题标题】:Add span for each letter, but avoid html tags using javascript为每个字母添加跨度,但避免使用 javascript 的 html 标记
【发布时间】:2018-12-02 14:44:34
【问题描述】:

我有一个字符串

var string = "Selected<br>Works"

我需要用&lt;span&gt;&lt;/span&gt; 包装每个字母,避免将&lt;br&gt; 标签包装在span 内。正则表达式可以吗?

我做到了:

'Selected<br>Works'.replace(/\S/g, '<span class="letter">$&</span>')

返回:

<span class="letter">S</span>
<span class="letter">e</span>
<span class="letter">l</span>
<span class="letter">e</span>
<span class="letter">c</span>
<span class="letter">t</span>
<span class="letter">e</span>
<span class="letter">d</span>
<span class="letter">&lt;</span>
<span class="letter">b</span>
<span class="letter">r</span>
<span class="letter">&gt;</span>
<span class="letter">W</span>
<span class="letter">o</span>
<span class="letter">r</span>
<span class="letter">k</span>
<span class="letter">s</span>

而期望的结果是:

<span class="letter">S</span>
<span class="letter">e</span>
<span class="letter">l</span>
<span class="letter">e</span>
<span class="letter">c</span>
<span class="letter">t</span>
<span class="letter">e</span>
<span class="letter">d</span>
<br>
<span class="letter">W</span>
<span class="letter">o</span>
<span class="letter">r</span>
<span class="letter">k</span>
<span class="letter">s</span>

其他字符串示例有:

  • Art Direction&lt;br&gt;Creative Concept&lt;br&gt;UX/UI Design

  • Digital Branding&lt;br&gt;Website

【问题讨论】:

  • 每个字母或每个单词?
  • 你试过什么?什么没用?你得到了什么?你期待什么?
  • 还请提供多个预期的输入和输出示例。
  • @kinduser,是的,每个字母
  • 你对返回的字符串做了什么,我假设它被附加到文档中?

标签: javascript html regex string


【解决方案1】:

您可以将replace 与前瞻式正则表达式一起使用:

var string = "Selected<br>Works",
    result = string.replace(/(?![^<]*>)[^<]/g, c => `<span>${c}</span>\n`);

console.log(result);

这也会跳过其他标签,例如 &lt;p&gt;&lt;/canvas&gt;。尽管如此,它仍无法处理更复杂的 HTML(包括脚本、cmets 等),而正则表达式不适合这些 HTML。

【讨论】:

  • 太棒了!工作得几乎完美,除了我需要找到一种方法来保持&lt;br&gt; :/ tag
  • 它就在那里。你运行 sn-p 了吗?
  • 删除 \n 时效果很好。谢谢!
【解决方案2】:

您可以通过&lt;br&gt; 分隔符拆分字符串,返回多个包含字母的数组。然后使用.map().replace() 将每个字母包装在&lt;span&gt;&lt;/span&gt; 中。最后通过&lt;br&gt;加入数组

var string = "Selected<br>Works";
var newStr = string.split("<br>").map(function(val){
  return val.replace(/(\S)/g, "<span>$1</span>");
}).join("<br>");

console.log(newStr);
document.body.innerHTML = (newStr);
span:nth-child(even) {color: blue}
span:nth-child(odd) {color: red}

【讨论】:

  • @Toto 如果我按所有标签拆分字符串,我无法按相关标签加入数组,所有标签都将被删除
  • 我的错,对不起。
猜你喜欢
  • 2018-02-03
  • 2015-06-13
  • 2020-05-16
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多