从HTML获取内部嵌套列表

时间:2018-07-04 15:24:25

标签: php regex

我正在开发一个HTML到OOXML的转换器,并且嵌套列表存在一些问题,我试图使用正则表达式来捕获它们。

想象一下以下列表项用例

  1. <li>Hi</li>-只是一些文字,应该忽略
  2. <li><ul><li>hi</li></ul></li>-直接在<li>
  3. <li>Hi<ul><li>hi</li></ul></li>-嵌套列表之前的纯文本
  4. <li><strong>Hi</strong><ul><li>hi</li></ul></li>-嵌套列表之前的HTML内容

https://regexr.com/3rvch处理2.3.,但是我似乎无法对4.进行排序。 4的主要问题是它还需要允许HTML标记,但需要忽略</li>。我一直在尝试https://regexr.com/3rvem的方法,但是无法使其正常工作。

正则表达式需要获取:

  1. 最初<li>之后,<(ul|ol>之前的内容
  2. <ul|ol>块及其内容

1 个答案:

答案 0 :(得分:1)

recursive regexconditional结合使用以捕获不包含<[uo]l>的嵌套标记,使用capturing group捕获嵌套标记的想法如何。这有点实验性,但似乎可行。

<li>(?>[^<]+|(<[uo]l)>|<(?!\/?li)[^>]*>|(?R))*<\/li>(?(1)|(*F))
  • (<[uo]l)>的第一个if group 1 set捕获列表标记(如果<li>中存在)
  • (?R)的意思是:将整个正则表达式粘贴到此处(递归)
  • (?(1)|(*F))的意思是:See this demo at regex101 for testing好,什么都不做,否则失败(*F) = (?!)

{{3}}(由于输入速度太慢,它可能会因为正则表达式过慢而失败)