2 回答
TA贡献2065条经验 获得超14个赞
与其尝试为非常规语言提出正则表达式,不如使用querySelectorAll().这将允许您选择所有具有 class 的 span 元素mention-inserted。然后,您可以使用 循环访问此集合,.forEach并使用将span元素更改为链接.outerHTML。
请参见下面的示例:
document.querySelectorAll('span.mention-inserted').forEach(elem => {
elem.outerHTML = `<a class="${elem.classList.value} active-link">${elem.innerHTML}</a>`;
});
.active-link {
color: blue;
cursor: pointer;
}
<p>
Here are some users you mentioned:
<span class="mention-inserted foo">@johnsmith1</span>,
<span class="mention-inserted">@daisy_apple23</span>,
<span class="mention-inserted">@bob.erricson</span>
</p>
如果您的文本是 JS 中的字符串(而不是 HTML),您可以使用 aDOMParser代替,这将允许您使用上述方法:
const str = `<p>Here are some users you mentioned: <span class="mention-inserted">@johnsmith1</span>,<span class="mention-inserted">@daisy_apple23</span>,<span class="mention-inserted">@bob.erricson</span></p>`;
const parsed = new DOMParser().parseFromString(str, "text/html").body;
parsed.querySelectorAll('span.mention-inserted').forEach(elem => {
elem.outerHTML = `<a class="${elem.classList.value} active-link">${elem.innerHTML}</a>`;
});
const result = parsed.innerHTML; // String output/result
document.body.appendChild(parsed); // HTMLHtmlElement object output
console.log(result);
.active-link {
color: blue;
cursor: pointer;
}
TA贡献1851条经验 获得超5个赞
我尝试使用正则表达式来突出显示 html textNode 而不是更改 html 结构,但这很复杂。所以我使用 DOM API 来实现它。
function replaceSpanWithAnchor(htmlText) {
const node = document.createElement('div')
node.innerHTML = htmlText
const spans = node.querySelectorAll('span')
for (let span of spans) {
let a = document.createElement('a')
a.className = "mention-inserted active-link"
a.textContent = span.textContent
span.replaceWith(a)
}
return node.innerHTML
}
console.log(replaceSpanWithAnchor('<p>Here are some users you mentioned: <span class="mention-inserted">@johnsmith1</span>,<span class="mention-inserted">@daisy_apple23</span>,<span class="mention-inserted">@bob.erricson</span>.</p>'))
// <p>Here are some users you mentioned: <a class="mention-inserted active-link">@johnsmith1</a>,<a class="mention-inserted active-link">@daisy_apple23</a>,<a class="mention-inserted active-link">@bob.erricson</a>.</p>
添加回答
举报