gpt4 book ai didi

JavaScript 正则表达式 : inserting span tag for each character

转载 作者:行者123 更新时间:2023-11-30 07:28:58 25 4
gpt4 key购买 nike

我手头有一个正则表达式任务,确实需要一些帮助。

假设我有如下文本:

To Sherlock Holmes she is always <i>THE</i> woman.

我需要将每个字符包含在一个 span 标签中,HTML 标签除外。例如,上面的文本将是:

<span>T</span><span>o</span><span> </span><span>S</span><span>h</span>
<span>e</span><span>r</span><span>l</span><span>o</span><span>c</span>
<span>k</span><span> </span><span>H</span><span>o</span><span>l</span>
<span>m</span><span>e</span><span>s</span><span> </span><span>s</span>
<span>h</span><span>e</span><span> </span><span>i</span><span>s</span>
<span> </span><span>a</span><span>l</span><span>w</span><span>a</span>
<span>y</span><span>s</span><span> </span><i><span>T</span><span>H</span>
<span>E</span></i><span> </span><span>w</span><span>o</span><span>m</span>
<span>a</span><span>n</span><span>.</span>

注意:

  • 每个字符都包含在一个范围内标签,甚至一个空格
  • HTML 标签,<i></i>不是

欢迎任何建议。

谢谢!

最佳答案

这项工作最好由 DOM 交互处理。以下两个实用函数将有助于使用 span 标记包装给定文本中的每个字符。

/**
* recursively get all text nodes as an array for a given element
*/
function getTextNodes(node) {
var childTextNodes = [];

if (!node.hasChildNodes()) {
return;
}

var childNodes = node.childNodes;
for (var i = 0; i < childNodes.length; i++) {
if (childNodes[i].nodeType == Node.TEXT_NODE) {
childTextNodes.push(childNodes[i]);
}
else if (childNodes[i].nodeType == Node.ELEMENT_NODE) {
Array.prototype.push.apply(childTextNodes, getTextNodes(childNodes[i]));
}
}

return childTextNodes;
}

/**
* given a text node, wrap each character in the
* given tag.
*/
function wrapEachCharacter(textNode, tag) {
var text = textNode.nodeValue;
var parent = textNode.parentNode;

var characters = text.split('');
characters.forEach(function(character) {
var element = document.createElement(tag);
var characterNode = document.createTextNode(character);
element.appendChild(characterNode);

parent.insertBefore(element, textNode);
});

parent.removeChild(textNode);
}

现在给定一段 HTML,我们将创建它的 DOM 表示,然后使用第一个函数 - getTextNodes 从中检索所有文本节点。一旦我们拥有所有文本节点,我们就可以将它们中的每一个传递给第二个函数 - wrapEachCharacter

// create a wrapper element that will hold our HTML.
var container = document.createElement('div');
container.innerHTML = "To Sherlock Holmes she is always <i>THE</i> woman.";

// get all text nodes recursively.
var allTextNodes = getTextNodes(container);

// wrap each character in each text node thus gathered.
allTextNodes.forEach(function(textNode) {
wrapEachCharacter(textNode, 'span');
});

发布了一个例子here .

关于JavaScript 正则表达式 : inserting span tag for each character,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com