簡體   English   中英

按列表從字符串中刪除所有html標簽,第一個除外

[英]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 = truefirst = {}並檢查

if (!first[tag]) {
    first[tag] = true;
} else {
    return '';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM