使用 PCRE 从 Twig 模板中分离出前面的内容

Splitting out front matter from a Twig template with PCRE

假设我想从 Twig 模板中拆分元数据

---
some metadata
multiple lines
---
Twig template
More data

我想到了 /\A---\R(.+?\R)?---\R(.*)\Z/s 或多或少,但我想知道它是否会在回溯中变得病态。

您的正则表达式似乎运行良好。

如果你 "unroll" 第一个惰性点模式

你可能会使它更有效
/\A---\R(.*(?:\R(?!---\R).*)*\R)?---\R(?s)(.*)\Z/

regex demo。注意:不需要修饰符,模式中有一个内联 (?s) 修饰符。

详情

  • \A - 字符串开头
  • ---\R - 完整的 --- 行,带有换行符
  • (.*(?:\R(?!---\R).*)*\R)? - 可选的捕获组 1:
    • .* - 整行
    • (?:\R(?!---\R).*)* - 0 次或多次重复
      • \R(?!---\R) - 换行符后没有 --- 行后跟换行符
      • .* - 整行
    • \R - 换行序列
  • ---\R - 完整的 --- 行,带有换行符
  • (?s) - 一个内联 DOTALL 修饰符,使右边的点匹配换行符
  • (.*) 第 2 组:尽可能多的任何 0+ 个字符
  • \Z - 字符串结尾。