【发布时间】:2016-09-08 06:01:00
【问题描述】:
我需要在里面替换$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 != ""
它替换了第三个 $username 它不应该匹配那个。
【问题讨论】:
-
eval('$result = "xxx $foo xxx $bar";'); -
当文字
$之前有文字反斜杠时,您拥有的这个正则表达式会在转义序列上绊倒。正则表达式解决方案在这里不是 100% 安全的。 -
代码 sn-p 总是那么简单吗?还是可以任意复杂(例如整个脚本)?如果它是任意复杂的,你不能这样做。无论多么强大,你都不能编写一个可以实现完整 PHP 代码解析器的正则表达式。
-
@MarcB 我不想要完整的解析器我只需要这个简单的案例,双引号内的 php 变量。
-
那你为什么不能使用简单的字符串替换呢?
str_replace($your_string, '$foo', 'whatever foo should be')?