使用 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
- 字符串结尾。
假设我想从 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
- 字符串结尾。