从字符串列表中删除所有html标记,除了第一个

Remove all html tags from string by list, except the first one

本文关键字:标记 第一个 html 列表 字符串 删除      更新时间:2023-09-26

我有一串html标签和一个禁用标签列表:在forbiddenTags中找到的任何标签都应该从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)它还删除forbiddenTags中找到的字符串的第一个标签。

2)它不删除标签的内容。

的例子:

<div>hi</div>
<div>how</div>
<div></div>
应:

<div>hi</div>

这是我的jsfield:http://jsfiddle.net/Ht6Ym/3469/

感谢任何帮助!

要匹配标记的内容和标记本身,您需要更改正则表达式以同时查找开始和结束标记。目前,它只检查一个或另一个,这就是为什么标签内容被留下。

这个正则表达式查找一个开始标记(和任何相关的属性),匹配的结束标记,以及任何中间的文本:

new RegExp("<(" + forbiddenTags[i] + ")[^>]*>(.*?)</''1>", "gi")

您的另一个问题(不想删除第一个匹配)可以通过将匿名函数作为参数传递给str.replace来解决。在该函数中,使用计数器变量来确定何时删除匹配项。

要做到这一点,您需要在某处添加一个计数器变量。如果你想留下的第一个匹配,每个类型的禁止标签,把它放在你的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]);
}

使用str.match获取所有匹配项并丢弃除第一个之外的所有匹配项

似乎Rob W在这篇文章上的答案是你正在寻找的。所有你需要改变的是first = truefirst = {},并检查

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