Php 正则表达式从函数param获取字符串?

Php 正则表达式从函数param获取字符串?,php,regex,string,Php,Regex,String,有人能帮我解决正则表达式的问题吗。我正在制作一个脚本来遍历我所有的.php文件,并将所有字符串传递给某个函数。我需要匹配以下情况: /* Double quotes */ function("some string"); // Match: some string function("some \"string\""); // Match: some "string" function("some 'string'"); // Match: some 'string' /* Single qu

有人能帮我解决正则表达式的问题吗。我正在制作一个脚本来遍历我所有的.php文件,并将所有字符串传递给某个函数。我需要匹配以下情况:

/* Double quotes */
function("some string"); // Match: some string
function("some \"string\""); // Match: some "string"
function("some 'string'"); // Match: some 'string'

/* Single quotes */
function('some string'); // Match: some string
function('some \'string\''); // Match: some 'string'
function('some "string"'); // Match: some "string"
/* Additional parameters */
function("some string", "param"); // Match: some string
function("some string", $param); // Match: some string
函数还可以接受字符串后的参数,因此它还需要匹配以下情况:

/* Double quotes */
function("some string"); // Match: some string
function("some \"string\""); // Match: some "string"
function("some 'string'"); // Match: some 'string'

/* Single quotes */
function('some string'); // Match: some string
function('some \'string\''); // Match: some 'string'
function('some "string"'); // Match: some "string"
/* Additional parameters */
function("some string", "param"); // Match: some string
function("some string", $param); // Match: some string
因此,从本质上讲,param可以是字符串(带引号或双引号)或无引号的变量。 我只需要从函数的第一个参数中获取字符串,不管第二个参数是否存在或是否以任何方式引用


提前感谢…

这里有一个可能帮助您开始的快速草图:

while (readline) {
    my ($matched) = m{
        \b function \s* \( \s*
        (
            " (?: [^"\\] | \\ .)* "
        |
            ' (?: [^'\\] | \\ .)* '
        )
    }sx or next;
    my $value = php_unescape $matched; # XXX: write me
    print $value, "\n";
}

您的特定示例已成功处理为

preg_match_all('#\\(\\s*("((\\\\.|[^"])+)"|\'((\\\\.|[^\'])+)\'),?#s', $test, $matches);
给你

说明:我们尝试匹配左括号(谢天谢地,它是PHP;在Ruby中要困难得多),后跟任意数量的空格字符,后跟

  • “(\\.[^”])+”
  • ”(\\.[^'])+”
…后跟可选逗号


这些序列中的每一个都包含“特殊字符”(用斜杠转义)和“普通字符”(与分隔符不同)。

您可以使用php解析器,而不是使用正则表达式(您自己),它可以为您提供某种类型的,例如,在


在这里,我在
sed
中编写了一个脚本。将它保存在一个文件
file.sed

bs
:gf
s:,.*$::
s:^.::
s;.$;;
s:[\]\(["']\):\1:g
p;d
:s
/.*(\([^)]*\).*/ s::\1:
tgf
d
接下来,运行它
sed-f file.sed file.py

for x in `find -name \*.py`; do sed -f file.sed $x; done
编辑:


可以用一行sed命令替换脚本,但是调用它可以使调试变得更加清晰。

那么,您尝试了什么?这可能会对您有所帮助:我只使用以下命令获取了两个相同引号(单引号或双引号)之间的字符串:[single quote]'/\uUu(\'(.*?)/I'和[double]'/\uUu(\'(.*)\“/i”在使用单引号字符串时,不需要将所有反斜杠加倍。只需将文本的四个反斜杠保留在原位。
\(\\s
可以变成
\(\s