如何匹配双引号内的所有php变量

时间:2016-09-07 19:26:38

标签: php regex

我需要替换$bar内部:

"foo$bar baz"

以及$foo$bar内部:

"xxx $foo xxx $bar"

有些价值。到目前为止,我有正则表达式匹配所有变量多少php变量但不在单引号内,而不是对象和方法调用:

%'[^']+'(*SKIP)(*F)|(?<!\\\\)\\$([\w./]+)\b(?!->)%

我使用json_encode替换值,但如果值在双引号内,我不想使用json_encode,因此"$foo"的值不会是""something""

我试过这段代码:

while(preg_match('%("(?:[^"]|\\\\")+?)\\$([\w./]+)\b(?!->)%', $str)) {
    $str = preg_replace_callback('%("(?:[^"]|\\\\")+?)\\$([\w./]+)\b(?!->)%', function($matches) use ($context, $self) {
        return $matches[1] . $self->get_context_var($context, $matches[2]);
    }, $str);
}

但是当有这个字符串时它不起作用:

"/$username|$username/" && $username != ""

它替换第3个$username它不应该与那个匹配。

1 个答案:

答案 0 :(得分:1)

<强> 更新

可以一步完成,同时替换所有正常的$var,你捕获双引号字符串并用其他东西替换它们内部的$var(双引号字符串中的转义字符被认为是):

Live demo

preg_replace_callback('~\'[^\']+\'(*SKIP)(*F)|"(?<double>[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|(?<!\\\\)\$([\w.\/]+)\b(?!->)~', function($match) {
    if (!empty($match['double'])) {
        return '"'.preg_replace('/(?<!\\\\)\$([\w.\/]+)\b(?!->)/', 'NOT_JSON_ENOCDE', $match['double']).'"';
    } else {
        return "JSON_ENOCDE";
    }
}, $str);