[英]Remove all html tags from string by list, except the first one
我有一個html標簽字符串和一個禁止標簽列表:在禁止標簽中找到的所有標簽都應從str中刪除,第一個除外。
也許可以通過一個字符串循環來完成
我嘗試了下一件事情:
var forbiddenTags = ["div", "city"];
var str = '<?xml version="1.0" encoding="UTF-8"?>' +
'<ADDUMP>' +
' <HEADER>' +
' <div></div>' +
' <div>Help Wanted Line</div>' +
' </HEADER>' +
' <ADINFO>' +
' <CUSTOMER>' +
' <CITY></CITY>' +
' <Div></DIV>' +
' <STATE></STATE>' +
' </CUSTOMER>' +
' </ADINFO>' +
'</ADDUMP>' +
'</xml>';
var arrayLength = forbiddenTags.length;
for (var i = 0; i < arrayLength; i++) {
// remove all forbiddenTags (upper and lower case)
var re = new RegExp("</? *" + forbiddenTags[i] + "[^>]*>","gi");
str = str.replace(re, "");
}
console.log(str);
不幸的是,有兩個問題:
1)它還刪除在bidbiddens中找到的字符串的第一個標簽。
2)它不會刪除標簽的內容。
例:
<div>hi</div>
<div>how</div>
<div></div>
應該:
<div>hi</div>
這是我的jsfiddle: http : //jsfiddle.net/Ht6Ym/3469/
任何幫助表示贊賞!
使用str.match
獲取所有匹配項,並丟棄除第一個匹配項以外的所有匹配項。
為了匹配標簽的內容以及標簽本身,您需要更改正則表達式以同時查找開始和結束標簽。 當前,它僅檢查一個或另一個,這就是為什么保留標簽內容的原因。
此正則表達式查找匹配的結束標記的開始標記(及所有相關屬性),以及所有插入的文本:
new RegExp("<(" + forbiddenTags[i] + ")[^>]*>(.*?)</\\1>", "gi")
您的其他問題(不想刪除第一個匹配項)可以通過將匿名函數作為參數傳遞給str.replace
來解決。 在該函數中,使用計數器變量來確定何時刪除匹配項。
為此,您需要在某處添加一個計數器變量。 如果要保留每種禁止標記的第一個匹配項,請將其放在for
循環中。 如果您只想保留整個發現的第一個禁止標記,請在for
循環外對其for
初始化(不清楚您要從問題中選擇哪個標記)。 然后替換str = str.replace(re, "");
有了這個:
str = str.replace(re, function(matchedText){
if (++counter>1){
return "";
} else {
return matchedText;
}
});
此功能針對每個匹配項運行。 如果是第一個匹配項,則僅返回該匹配項(實際上,將其保留)。 否則,將其刪除。
現在,所有這些使您的循環看起來像這樣:
for (var i = 0; i < forbiddenTags.length; i++) {
var counter=0
var re = new RegExp("<(" + forbiddenTags[i] + ")[^>]*>(.*?)</\\1>", "gi");
str = str.replace(re, function(matchedText){
if (++counter>1){
return "";
} else {
return matchedText;
}
});
}
如果可以選擇使用jQuery,則可以使用以下答案中的功能使外觀看起來更整潔(即,刪除令人討厭的正則表達式):
var removeElements = function(text, selector) {
var wrapped = $("<div>" + text + "</div>");
wrapped.find(selector+":not(:first)").remove();
return wrapped.html();
}
for (var i = 0; i < forbiddenTags.length; i++) {
str = removeElements(str, forbiddenTags[i]);
}
看來Rob W在此職位上的答案就是您想要的。 您需要更改的是first = true
到first = {}
並檢查
if (!first[tag]) {
first[tag] = true;
} else {
return '';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.