2015-01-04 205 views
0

我想使用此代码从文档中删除除<a><img>和所有的HTML标签:删除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>" 

请帮忙!

+0

你能确切说出你想干什么? –

+0

是不是'[\ s \ S]'等同于'.'?你有没有尝试在你的'while'循环中添加'console.log(temp)'(或者设置一个中断点)来查看实际发生的事情? – nnnnnn

+0

[\ s \ S]允许正则表达式匹配多行 – levkaster

回答

2

你可以不用正则表达式。尝试使用正则表达式解析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));

2

这是最好的,我可以拿出!

<((?!a)|a\w)(?!\/a)(?!img)(?!iframe)(?!\/iframe)+([\s\S]*?)> 

第一个捕获组,不是一个或一个词后面,允许音频,缩写,地址等全部通过。

只需将上述正则表达式中的匹配替换为无。

请参阅:http://regexr.com/3a5hp