php 中的正则表达式捕获函数参数


Regex catching function parameters in php

目前我正在尝试使用正则表达式获取所有函数参数以进行模板化。函数参数将很像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+个字符
  • ,? - 可选的逗号(? - 出现一次或零次)