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>
添加回答
舉報