这是我的难题:
我编写了此RegEx模式,该模式可在我的沙箱中使用,但不适用于我的网站:
沙盒:http://regex101.com/r/vP3uG4
模式:
(.*[$]'.$variable.'\s*=\s*\'?)(.*?)(\'?;.*)
代码行是这样的:
$savedsettings_new = preg_replace('/(.*[$]'.$variable.'\s*=\s*\'?)(.*?)(\'?;.*)/is','$1'. $value .'$3',$savedsettings_temp);
如您所见,它可以在沙盒上运行,但不能实时运行。
我正在尝试匹配变量的值,这些变量的值可以表示为字符串(用单引号引起来)或不带引号的数值,例如:
$match_string = 'value';
$match_number = 1;
现在,这段代码可以很好地处理字符串,但是可以使用数字变量,而这些数字变量没有包含在字符串中,我只得到反向引用$ 3的内容,在此之前我什么也没得到!
我抓挠头,真的不知道为什么它能在RegEx101上工作但不能正常工作……当匹配一个或没有单引号(并且转义它们,因为preg_replace带有引号时,我做错了吗?)
好的,找出问题所在。解决方案是将反向引用包装在中${}
。
引用PHP手册:
当使用在反向引用后紧跟另一个数字的替换模式(即:在匹配模式后立即放置文字数字)时,您不能使用熟悉的
\\1
符号作为反向引用。\\11
,例如,会使preg_replace()感到困惑,因为它不知道是要\\1
使用文本1
的\\11
反向引用,还是不使用文本的反向引用。在这种情况下,解决方案是使用\${1}1
。
因此,您的代码应如下所示:
header('Content-Type: text/plain');
$variable = 'tbs_development';
$value = '333';
$savedsettings_temp = <<<'CODE'
$tbs_underconstruction = 'foo';
$tbs_development = 0;
CODE;
$pattern = '/(.*[$]'.preg_quote($variable).'\s*=\s*\'?)(.*?)(\'?;.*)/is';
$replacement = '${1}'.$value.'${3}';
$savedsettings_new = preg_replace($pattern, $replacement, $savedsettings_temp);
echo $savedsettings_new;
输出:
$tbs_underconstruction = 'foo';
$tbs_development = 333;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句