目前我正在尝试使用正则表达式获取所有函数参数以进行模板化。函数参数将很像PHP可兼容的。
所以这里是需要解析的示例文本:
"test", 'test2', $test3, ?"%A %d %B %Y", "foo,bar,foobar"
这需要解析为:
[
'"test"',
'''test2''',
'$test3',
'?"%A %d %B %Y"',
'"foo,bar,foobar"'
]
我发现了这种模式,但是。当它在双引号之间有逗号 (,) 时,它也会将它们分开。
'~([^,]+'(.+?'))|([^,]+)~x'
此模式的结果是:
[
'"test"',
' ''test2''',
' $test3',
' ?"%A %d %B %Y"',
' "foo,',
'bar,',
'foobar"'
]
我不太擅长正则表达式模式。我可以用它实现基本的事情,但我找不到实现这一目标的方法。
您的正则表达式不处理很多事情,其中之一是空格后的双引号值。由于开头没有可选的空格模式,因此最后一个替代触发器,并在逗号处停止。
您可以使用以下正则表达式:
's*("[^"'']*(?:''.[^''"]*)*"|'[^''']*(?:''.[^''']*)*'|[^,]+),?
请参阅正则表达式演示,并获取捕获组 1 值。
下面是一个 IDEONE 演示:
$re = '~'s*("[^"'''']*(?:''''.[^''''"]*)*"|''[^'''''']*(?:''''.[^'''''']*)*''|[^,]+),?~';
$str = "'"test'", 'test2', '$test3, ?'"%A %d %B %Y'", '"foo,bar,foobar'"";
preg_match_all($re, $str, $tokens);
print_r($tokens[1]);
模式说明:
-
's*
- 零个或多个空格 -
("[^"'']*(?:''.[^''"]*)*"|'[^''']*(?:''.[^''']*)*'|[^,]+)
- 3 种备选方案之一:-
"[^"'']*(?:''.[^''"]*)*"
- 双引号字符串(支持转义序列) -
|
- 或 -
'[^''']*(?:''.[^''']*)*'
- 单引号字符串(支持转义序列) -
|
- 或 -
[^,]+
- 逗号以外的1+个字符
-
-
,?
- 可选的逗号(?
- 出现一次或零次)