【问题标题】:Remove all html tags from string by list, except the first one按列表从字符串中删除所有 html 标签,第一个标签除外
【发布时间】:2015-11-18 00:03:41
【问题描述】:

我有一串 html 标签和一个禁止标签列表: 应该从 str 中删除在 disabledTags 中找到的任何标签,除了第一个标签。

也许可以通过字符串的一个循环来完成

我尝试了下一件事:

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) 它还删除了在禁止标签中找到的字符串的第一个标签。

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

示例:

<div>hi</div>
<div>how</div>
<div></div>

应该是:

<div>hi</div>

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

任何帮助表示赞赏!

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

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

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

    您的其他问题(不想删除第一个匹配项)可以通过passing an anonymous function as a parameter to 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 是一个选项,您可以使用this answer 中的函数使事情看起来更干净(即删除那个讨厌的正则表达式):

    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]);
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        Rob W 在this post 上的答案似乎就是您要找的。 您只需将first = true 更改为first = {} 并检查

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

        【讨论】:

          猜你喜欢
          • 2011-10-15
          • 2019-06-21
          • 1970-01-01
          • 2015-11-19
          • 2013-02-24
          • 1970-01-01
          • 2014-09-14
          • 2015-10-09
          • 1970-01-01
          相关资源
          最近更新 更多