在 javascript 中使用正则表达式删除 html 标记
Remove html tags using regex in javascript
我想使用以下代码从文档中删除除<a>
<img>
和<iframe>
之外的所有html标签:
var regex = "<(?!a )(?!img )(?!iframe )(['s'S]*?)>";
var temp;
while (source.match(regex)) {
temp = source.match(regex)[0];
source = source.replace(temp, "");
}
return source;
它适用于在线正则表达式测试器,但由于某种原因它不适用于我的页面。例如,当输入为:
"<p class="MsoNormal" style="margin-left:202.5pt;line-height:200%;background:white"><b><span style="font-size: 16pt; line-height: 200%; color: rgb(131, 60, 11); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">test</span></b><span style="font-size:16.0pt;
line-height:200%;color:#833C0B;letter-spacing:-.15pt;mso-ansi-language:EN-US"><o:p></o:p></span></p>"
请帮忙!
你可以在没有正则表达式的情况下做到这一点。尝试使用正则表达式解析 HTML 通常不是一个好主意,除非用例非常简单......
我实现stripHtmlElementsMatching
的方式,你可以传递给它任何CSS选择器,它将剥离所有匹配的实体。
因此,要删除除a, img, iframe
以外的任何内容,您可以传递 :not(a):not(img):not(iframe)
.
PS:htmlstripping-root
自定义标签只是为了避免创建一个干扰传递的选择器的解析器元素。例如,如果我使用 div
作为解析器元素并且您将传递选择器 div > div
,即使它们没有嵌套在您的 html 字符串中,所有div 也会被删除。
var stripHtmlElementsMatching = (function(doc) {
doc.registerElement('htmlstripping-root');
return function(text, selector) {
var parser = document.createElement('htmlstripping-root'),
matchingEls, i, len, el;
selector = typeof selector == 'string' ? selector : ':not(*)';
parser.innerHTML = text;
matchingEls = parser.querySelectorAll(selector);
for (i = 0, len = matchingEls.length; i < len; i++) {
el = matchingEls[i];
el.parentNode.replaceChild(newFragFrom(el.childNodes), el);
}
return parser.innerHTML;
};
function newFragFrom(nodes) {
var frag = document.createDocumentFragment();
while (nodes.length) frag.appendChild(nodes[0]);
return frag;
}
})(document);
var text = '<p class="MsoNormal" style="margin-left:202.5pt;line-height:200%;background:white"><b><span style="font-size: 16pt; line-height: 200%; color: rgb(131, 60, 11); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">test</span></b><span style="font-size:16.0pt; line-height:200%;color:#833C0B;letter-spacing:-.15pt;mso-ansi-language:EN-US"><o:p></o:p></span></p>';
var tagsToKeep = ['a', 'img', 'iframe'];
var sanitizeSelector = tagsToKeep.map(function(tag) {
return ':not(' + tag + ')';
}).join('');
var sanitizedText = stripHtmlElementsMatching(text, sanitizeSelector);
document.body.appendChild(document.createTextNode(sanitizedText));
这是我
能想到的最好的!
<((?!a)|a'w)(?!'/a)(?!img)(?!iframe)(?!'/iframe)+(['s'S]*?)>
第一个捕获组,不是 a 或 a 后跟一个单词,允许音频、缩写、地址等全部通过。
只需将上述正则表达式中的匹配项替换为任何内容即可。
请参阅:http://regexr.com/3a5hp
相关文章:
- 删除HTML节点而不删除其子节点
- 如何删除 html 表的行
- 使用javascript从html页面中删除html标记
- 从字符串中删除 HTML(在 JSON 响应中)
- 如何从表格单元格中删除html的某些部分
- jquery text()删除html标记并合并文本
- 正在使用JavaScript删除HTML表
- 从列表标记和表标记中删除HTML中的空白
- 删除html表单的确认
- 当元素的构造未知时,删除Html元素
- 如何使用javascript从网页中删除HTML元素?(试图制作镀铬扩展)
- 删除HTML脚本标记会对它所包含的JavaScript产生任何影响吗
- 在动态添加/删除HTML时防止内存泄漏
- 删除HTML标签中包含的文本
- 使用 javascript 删除 html
- 无法从响应 JSON 中删除 html 标记
- 移除/删除 HTML 表单中的所有子元素
- 是否分配给内部 HTML 删除 HTML 子树
- 如何在不使用正则表达式的情况下从 JavaScript 中的字符串中删除 HTML 标记
- 从 jquery 库中删除 HTML 内联样式