javascript - 将正则表达式限制为仅非 html 文本
问题描述
我找到了这个 javascript 函数,它替换了字符串中的所有出现。它工作得很好,但我需要它只适用于非 html 元素,这只是意味着字符串中不在“<”和“>”之间的任何部分。
String.prototype.replaceAll = function (strReplace, strWith) {
// See http://stackoverflow.com/a/3561711/556609
var esc = strReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
var reg = new RegExp(esc, 'ig');
return this.replace(reg, strWith);
};
我希望这是因为有时会在 html 中找到“strReplace”字符串,因此会弄乱 HTML 输出。任何帮助表示赞赏:)
解决方案
假设您想用replaceAll
方法替换一个字符串:
如果一个字符串不是一个有效的 html,则将其视为纯文本。
如果一个字符串是一个有效的 html,则循环每个 textContent 以应用
replaceAll
。
解决方案(使用 element.innerHTML 而不是正则表达式,正如@epascarello 所说,使用正则表达式匹配 html 不是一个好主意):
将目标字符串加载到一个 dom 元素中
.innerHTML
循环此元素以获取所有文本节点。
申请
replaceAll
文本节点的内容。返回
el.innerHTML
String.prototype.replaceAll = function (strReplace, strWith) {
// See http://stackoverflow.com/a/3561711/556609
var esc = strReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
var reg = new RegExp(esc, 'ig');
return this.replace(reg, strWith);
}
function replaceAll2 (targetString, keyword, replaceWord) {
if (!keyword) return targetString
let el = document.createElement('div')
el.style.display='none'
el.innerHTML = targetString
let walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false)
let next = walk.nextNode()
while (next) {
next.textContent = next.textContent.replaceAll(keyword, replaceWord)
next = walk.nextNode()
}
return el.innerHTML
}
let test1 = 'I am a plain text'
let test2 = 'I <span>am</span> a <p>plain</p> text'
console.log(replaceAll2(test1, 'pl', '1'))
console.log(replaceAll2(test2, 'pl', '2'))
推荐阅读
- bash - 通过 bashrc 脚本替换文件中的内容并写入目录
- visual-studio-code - 弹出窗口上的 VS Code 错误详细信息不起作用
- eclipse - 如何翻译多语言的 BIRT 报告...?
- google-cloud-build - 存储库中的 Cloud Build yaml 和绕过权限的可能性?
- c - 没有链接到定义的变量的外部声明
- events - Jakarta EE CDI 事件 TransactionPhase.AFTER_SUCCESS 事件顺序是相反的
- python - 除使用 QIcon 外,如何将装饰角色形状更改为圆形?
- c# - 如何在 C# 中将带有字典的 ArrayList 显式转换为数组?
- sql - 在 SQL 中插入多个列和多个值
- laravel - Laravel domPdf 下载问题与 php artisan serve