我正在尝试创建类似smarty的simmiliar解析器。对于非常小的代码部分,不想实现巨大的类似smarty的解析器。
我想到的是: (?:([a-zA-Z0-9]+)=(?:([^\v '"]+)|"(.*?)"|'(.*?)')|([a-zA-Z0-9]+))
(?:([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的来源。。。
您需要使用 branch reset groups :
(?|([a-zA-Z0-9]+)=(?|([^\v '"]+)|"(.*?)"|'(.*?)')|([a-zA-Z0-9]+)) ^ ^
请参见 regex demo 。
参考文献:
Alternatives 在分支重置组内,共享相同的捕获组。语法为 (?|regex) 哪里 (?| 打开组,regex是任何正则表达式。如果在分支重置组中不使用任何交替或捕获组,则其特殊功能将无法发挥作用。然后作为 non-capturing group 。
(?|regex)
(?|