我需要替换$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
它不应该与那个匹配。
答案 0 :(得分:1)
<强> 更新 强>
可以一步完成,同时替换所有正常的$var
,你捕获双引号字符串并用其他东西替换它们内部的$var
(双引号字符串中的转义字符被认为是):
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);