【问题标题】:Parse parameters and values of smarty-like string in PHP在 PHP 中解析类似 smarty 的字符串的参数和值
【发布时间】:2018-09-04 12:53:06
【问题描述】:

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

我想出的是: (?:([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 来自哪里...

【问题讨论】:

标签: php pcre preg-match-all


【解决方案1】:

你需要使用branch reset groups:

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

请参阅regex demo

来自参考:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多