代码之家  ›  专栏  ›  技术社区  ›  Grzegorz

在PHP中解析smarty-like字符串的参数和值

  •  1
  • Grzegorz  · 技术社区  · 6 年前

    我正在尝试创建类似smarty的simmiliar解析器。对于非常小的代码部分,不想实现巨大的类似smarty的解析器。

    我想到的是: (?:([a-zA-Z0-9]+)=(?:([^\v '"]+)|"(.*?)"|'(.*?)')|([a-zA-Z0-9]+))

    在…上 https://regex101.com/r/l5FI5f/2/ 看起来不错。每个匹配项是1个或2个条目+完全匹配。

    当我复制PHP代码时,事情看起来就不同了。。。

    array (size=5)
      0 => string 'xddss='asdasda'' (length=15)
      1 => string 'xddss' (length=5)
      2 => string '' (length=0)
      3 => string '' (length=0)
      4 => string 'asdasda' (length=7)
    

    不确定索引2和3的来源。。。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Wiktor Stribiżew    6 年前

    您需要使用 branch reset groups :

    (?|([a-zA-Z0-9]+)=(?|([^\v '"]+)|"(.*?)"|'(.*?)')|([a-zA-Z0-9]+))
      ^                 ^
    

    请参见 regex demo

    参考文献:

    Alternatives 在分支重置组内,共享相同的捕获组。语法为 (?|regex) 哪里 (?| 打开组,regex是任何正则表达式。如果在分支重置组中不使用任何交替或捕获组,则其特殊功能将无法发挥作用。然后作为 non-capturing group