代码之家  ›  专栏  ›  技术社区  ›  Dan Lugg mab

有关Regex(PCRE)的帮助

  •  0
  • Dan Lugg mab  · 技术社区  · 15 年前

    我正在尝试计算一个PCRE regex字符串,用于匹配和捕获可变长度的字符串,以便在我的PHP应用程序中使用。我希望(如果可能的话)在一个解析中执行这些操作,但是如果在计算上看起来最合理的话,我可以将它分成几个运行,并按应用程序逻辑进行划分。

    {{ var:myVar }}
    {{ component:myComponent}}
    {{ var:myVar modifier:function[arg1|arg2] }}
    {{ region:myRegion modifier:function[arg1|arg2] modifier:function[arg1] }}
    

    如您所见,目标字符串之间可能存在相当大的差异。总结:

    {{ type:name modifierType:modifierName[arg1|arg2|...] }}
    
    • 分隔符 {{ }} .
    • 有效的 type name 表示为 [a-z_][a-z0-9_]* ;只有一个 type:name
    • 有效的 modifierType modifierName 表示为 [a-z_][a-z0-9_] ;的 后跟方括号中一个或多个参数的参数列表, [ ] . 参数列表由管道分隔 | . 可能有零个或多个 modifierType:modifierName[argumentList] 集合。
    • 字符串的所有部分都由一个或多个空格字符分隔 \s+

    无论如何,匹配的集合 {{ type:name }} 很简单,但我无法找到有效获取可变长度修饰符列表的方法。对于简单类型/名称对,我使用以下不区分大小写/自由间距字符串:

    '% {{ \s+ (?<type>var|component|region):(?<name>[a-z_][a-z0-9_]*) \s+ }} %ix'
    

    因此,任何关于捕获两者的建议:

    {{ component:myComponent }}
    {{ var:myVar format:datetime[Y-m-d] container:h3[class=timestamp|id=main] }}
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Amadan    15 年前

    您不想在一个regexp中获取全部内容,因为您可能希望修饰符作为数组。regexp始终具有固定数量的捕获,与捕获括号的数量相对应。

    抓住要点( {{ something }} ),按空格分割内容,然后分别循环和匹配每个内容,将内容推入适当的标量或数组(如果允许使用更多具有相同前缀的修饰符)。