【问题标题】:Regex for recursive "wiki-style" lists递归“wiki 样式”列表的正则表达式
【发布时间】:2023-03-12 11:17:01
【问题描述】:

我正在尝试创建一个正则表达式来匹配“wiki 样式”列表(使用 preg_replace_callback()):

* List Item 1  
* List Item 2  
*# List Item 2.1  
*# List Item 2.2  
* List Item 3 

星号表示无序列表,而数字符号表示有序列表。我试图得到它,以便它可以匹配无限深度,以便 * 和 # 可以混合。

我尝试了以下表达式(及其变体):/\s([\*#]{1,}) ([\S ]+)\s/si
但它似乎不想工作。

我做错了什么?或者有没有更好的方法来做到这一点?

【问题讨论】:

    标签: php regex pcre recursion


    【解决方案1】:

    试试这样的:

    \s*([*#]+)\s+.*
    

    【讨论】:

    • 我确实尝试过,结果是它匹配到了我列表中的某个点,然后在另一个回调替换中匹配了其余部分。基本上它所做的就是拆分我的列表。
    【解决方案2】:

    不确定我是否了解您在寻找什么,但([*#]{1,}) ([\S ]+) 不起作用?我认为这将为您在第 1 组的 **# 和第 2 组的“列表项 2.1”上提供匹配,如果这是您正在寻找的。我知道这基本上就是您所拥有的,但是在测试时我没有遇到任何问题。

    【讨论】:

    • 它也对我有用。我认为“\s”前置和附加到模式是必要的,因此该模式与“G**gle”的实例不匹配(例如)。话虽如此,它也对我有用。
    【解决方案3】:

    正则表达式通常不是递归的。您需要设置更传统的解析方法(可能是嵌套状态机使用正则表达式来控制转换)。

    【讨论】:

    • 这实际上是我正在做的。我正在使用正则表达式来匹配“* foo”或“# foo”或 #**# foo”,然后将结果传递给将构建列表标记的回调函数。我只是想知道是否有更“优雅”的方式来做到这一点。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2014-12-10
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多