【问题标题】:Regex open Li tag inside ul tag正则表达式在 ul 标签内打开 Li 标签
【发布时间】:2021-12-08 21:19:19
【问题描述】:

嗨,我正在尝试使用正则表达式,它只提取 ul 标签中的 li 标签(没有 ol)

文字:

<ul><li>some text</li></ul>
<ol><li>some text</li></lo>

提取

<ul>**<li>**some text</li></ul>
<ol><li>some text</li></lo>

你能帮我吗?

【问题讨论】:

    标签: html regex


    【解决方案1】:

    解决方案 1

    正则表达式解决方案

    /(?<=<ul>\s*(?:<li>.*?<\/li>\s*)*)<li>.*?<\/li>/gi
    

    Demo

    如果您在团队中工作并且其他人可能会阅读您的代码,我建议您使用解决方案 2。通过代码阅读更简单易懂。

    解决方案 2

    分两步完成:

    1. 删除所有&lt;ol&gt;...&lt;/ol&gt;节点;
    2. 获取所有&lt;li&gt;...&lt;/li&gt; 节点。

    *我假设您的 html 是有效的,并且您在 &lt;ul&gt;&lt;ol&gt; 之外没有 &lt;li&gt;

    JavaScript 中的代码示例:

    let html = `
      <ul>
        <li>take this node 1</li>
        <li>take this node 2</li>
      </ul>
      <ol>
        <li>exclude this node</li>
        <li>exclude this node</li>
      </ol>
      <ul>
        <li>take this node 3</li>
        <li>take this node 4</li>
      </ul>
      <ol>
        <li>exclude this node</li>
        <li>exclude this node</li>
      </ol>
    `;
    
    let htmlWithoutOl = html.replace(/<ol>.*?<\/ol>/gis, '');
    let matches = htmlWithoutOl.matchAll(/<li>.*?<\/li>/gis);
    for (const match of matches) {
      console.log(match[0]);
    }

    【讨论】: