【问题标题】:How to remove HTML tags along with id except allowed tags?除了允许的标签外,如何删除 HTML 标签以及 id?
【发布时间】:2020-07-11 03:07:51
【问题描述】:

这里是一些示例文本:

"-A3-<tag1>Sale</tag1>-cum-</blockquote><p <tag1>id</tag1>=\"p_12\"> </p><p 
<tag1>id</tag1>=\"p_13\">        Gift <tag1>Deed</tag1> <tag1>executed</tag1> by C.K. Koshy 
<tag1>in</tag1> favour <tag1>of</tag1> Quilon Diocese         <tag1>and</tag1> C.K."

我想知道如何删除&lt;p&gt; 标签、&lt;blockquote&gt; 标签以及所有id,但我想保留&lt;tag&gt;。仅当&lt;tag&gt; 环绕pblockquoteid 我想删除它。一直休息。我如何在 JavaScript 中做到这一点?我尝试了以下模式的正则表达式:

test = test.replace(/<(?!tag\s*\/?)[^>]+>/g, '')

这并没有产生令人满意的结果。这就是我的目标(期望的输出):

"-A3-<tag1>Sale</tag1>-cum- Gift <tag1>Deed</tag1> <tag1>executed</tag1> by C.K. Koshy 
<tag1>in</tag1> favour <tag1>of</tag1> Quilon Diocese  <tag1>and</tag1> C.K."

我如何得到这是 JS?

【问题讨论】:

    标签: javascript html regex dom


    【解决方案1】:

    您可以将string 解析为 HTML 并使用 DOM 操作来删除元素,这是一个示例:

    let input = `-A3-<tag1>Sale</tag1>-cum-</blockquote><p <tag1>id</tag1>="p_12"> </p><p 
    <tag1>id</tag1>="p_13">        Gift <tag1>Deed</tag1> <tag1>executed</tag1> by C.K. Koshy 
    <tag1>in</tag1> favour <tag1>of</tag1> Quilon Diocese         <tag1>and</tag1> C.K.`
    
    input = input.replace(/<tag1>id<\/tag1>/g, "id");
    
    const doc = new DOMParser().parseFromString(input, 'text/html');
    
    doc.querySelectorAll('blockquote, p').forEach((e) => {
      [...e.childNodes].forEach(child => {
        e.before(child);
      });
      e.remove();
    });
    
    const output = doc.body.innerHTML;
    console.log(output);

    这样做是首先使用一些正则表达式将原始输入转换为有效的 HTML,然后遍历所有 &lt;blockquote&gt;&lt;p&gt; 元素以提取所有子节点并将它们插入到它们的父节点之前,一旦是完成后,将删除空的 &lt;blockquote&gt;&lt;p&gt; 元素。

    【讨论】:

    • 嗨,我只想删除 pblockquote 元素,但我想保留其中的任何内容。您提供的代码正在输出此-A3-&lt;tag1&gt;Sale&lt;/tag1&gt;-cum-。您可以检查问题中所需的输出吗?这就是我想得到它的方式:)谢谢!
    • 非常感谢!
    【解决方案2】:

    在处理 HTML(或任何 XML)时,正则表达式永远不是答案。陷阱太多了。

    相反,您会想要了解实际结构的 jQuery 或 Cheerio(它模仿 jQuery 的 API,但只包含用于转换和操作 HTML 的东西而没有额外的东西)。如果您信任内容,您还可以使用innerHTML 将 HTML 转储到 HTML 元素中,并使用 querySelector() 访问它。

    然后只需选择您不想要的元素并删除它们即可。

    这是使用第三个选项的示例:

    const content = '<p>a</p><p>b</p><tag>c</tag><tag><p>d</p></tag><blockquote>e</blockquote>';
    const dummy = document.querySelector('#dummy');
    const output = document.querySelector('#output');
    
    dummy.innerHTML = content;
    
    const toRemove = Array.from(dummy.querySelectorAll('p, tag, blockquote')).filter(el =>
      // for the "element containing certain element" you can't do that with selector along, but can with a filter method
      !(
       (el.tagName === 'P' && el.parentNode.tagName === 'TAG')
         || (el.tagName === 'TAG' && el.querySelector('p'))
      )
    );
    
    toRemove.map(el => el.parentNode.removeChild(el));
    
    output.innerHTML = dummy.innerHTML;
    dummy.innerHTML = ''; // empty it out
    <div id="dummy"></div>
    <div id="output"></div>

    【讨论】:

    • 嗨,我试过但得到以下输出 - -A3-Sale-cum- 这不是我所期望的。我已经输入了我期望的输出。如果您能引导我走向正确的方向,那就太好了!
    • 另外,我会注意不要使用正则表达式。由于我来自更多的 Python 背景,我认为这是默认设置!
    • 正则表达式对很多事情都很有用,只是对 DOM 操作没有用。
    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多