javascript-按组查找RegExp中的多个事件

javascript-按组查找RegExp中的多个事件,javascript,php,regex,Javascript,Php,Regex,我得到了这种HTML结构: <p>TEST</p><ul><li>1 abc</li><li>2 def</li><li>3 ghi</li></ul> 所以我写了一个reg exp: <p>(.*?)<\/p>.*?<ul>(?(1)<li>(.*?)<\/li>*)<\/ul> (.*).*(?(1

我得到了这种HTML结构:

<p>TEST</p><ul><li>1 abc</li><li>2 def</li><li>3 ghi</li></ul>
所以我写了一个reg exp:

<p>(.*?)<\/p>.*?<ul>(?(1)<li>(.*?)<\/li>*)<\/ul>
(.*).*(?(1)
  • (.*))
  • 结果是:

    Match 1
    Full match  0-50    `<p>TEST</p><ul><li>1</li><li>2</li><li>3</li></ul>`
    Group 1.    3-7 `TEST`
    Group 2.    19-40   `1</li><li>2</li><li>3`
    
    匹配1
    完全匹配0-50`测试

    • 1
    • 2
    • 3
    ` 第一组。3-7 `测试` 第2组。19-40'1
  • 2
  • 3`
  • Cf Regex101:

    这是用PHP格式编写的,但我也可以将其与Javascript一起使用。
    有什么想法吗?

    您可以对每个标签序列进行拆分(无论如何,对于您的示例输入)

    代码:()

    *注意,不建议使用正则表达式解析html。下面是一个DomDocument/Xpath方法(主要来自)

    代码:()


    你必须使用正则表达式吗?DOM解析似乎更适合这个任务。我用它做了一个web垃圾,由于我的web hoster,我不能添加任何模块,所以我必须使用正则表达式。顺便说一句,我也知道我可以使用多个正则表达式,但我正试图用一个正则表达式来完成所有工作,以获得更快的代码。如果这不能满足您所有的用例,您需要改进您的问题并添加更多的示例输入。
    Match 1
    Full match  0-50    `<p>TEST</p><ul><li>1</li><li>2</li><li>3</li></ul>`
    Group 1.    3-7 `TEST`
    Group 2.    19-40   `1</li><li>2</li><li>3`
    
    $html=<<<HTML
    <p>TEST</p><ul><li>1</li><li>2</li><li>3</li></ul>
    HTML;
    
    var_export(preg_split('~(?:<[^>]+>)+~',$html,NULL,PREG_SPLIT_NO_EMPTY));
    
    array (
      0 => 'TEST',
      1 => '1',
      2 => '2',
      3 => '3',
    )
    
    $dom=new DOMDocument; 
    $dom->loadHTML($html);
    $xpath = new DOMXPath($dom);
    foreach ($xpath->evaluate('//*[count(*) = 0]') as $node) {
      $result[]=$node->nodeValue;
    }
    var_export($result);  // same output as my regex method