2017-07-05 41 views
0

我有内容的txt文件:文件形式的preg_replace只更换特定的组

fggfhfghfghf 

$config['website'] = 'Olpa'; 


asdasdasdasdasdas 

和PHP脚本文件被替换的preg_replace:

write_file('tekst.txt', preg_replace('/\$config\[\'website\'] = \'(.*)\';/', 'aaaaaa', file_get_contents('tekst.txt'))); 

但它不正是工作我希望它能工作。

因为这个剧本更换整场比赛,并且更改后它看起来像这样:

fggfhfghfghf 

aaaaaa 


asdasdasdasdasdas 

而且这是很糟糕。

所有我想要的是不会改变整个比赛$config['website'] = 'Olpa';但只是改变这种Olpa

enter image description here

正如你可以看到它属于不匹配信息2组。

而我想要的只是改变这个组2.一个特定的事情。

终于脚本后,它看起来像:

fggfhfghfghf 

$config['website'] = 'aaaaaa'; 


asdasdasdasdasdas 

回答

3

你需要改变你的preg_replace

preg_replace('/(\$config\[\'website\'] = \').*?(\';)/', '$1aaaaaa$2', file_get_contents('tekst.txt')) 

这意味着,捕捉你所需要的,以保持(再使用反向引用恢复文本),只是匹配你需要替换的东西。

查看regex demo

图案的详细资料

  • (\$config\[\'website\'] = \') - 第1组捕获字面$config['website'] = '子(后面$1参考)
  • .*? - 比换行符字符以外的任何字符0+尽可能少
  • (\';) - 第2组:a '后跟;(稍后参考$2

如果您aaa实际上以数字开头,你需要一个${1}反向引用。

2

我有一个更好,更快,更精简的解决方案。不需要任何捕捉组,只需要小心注意逃逸单引号:

模式:\$config\['website'] = '\K[^']+

\K的意思是“从这里开始的fullstring匹配”,这与否定的字符类([^']+)合并,得到遗漏捕获组。

Pattern Demo(仅25步)

PHP实现:

$txt='fggfhfghfghf 

$config[\'website\'] = \'Olpa\'; 


asdasdasdasdasdas'; 
print_r(preg_replace('/\$config\[\'website\'\] = \'\K[^\']+/','aaaaaa',$txt)); 

使用单引号括起来,这样$config不被解释为一个变量的模式是至关重要的。结果,模式中的所有单引号都必须被转义。

输出:

fggfhfghfghf 

$config['website'] = 'aaaaaa'; 


asdasdasdasdasdas