仅替换文件形式preg_replace中的特定组

时间:2017-07-05 21:00:21

标签: php regex preg-replace preg-match

我有内容的txt文件:

fggfhfghfghf

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


asdasdasdasdasdas

用于替换文件中的preg_replace的PHP脚本:

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

2 个答案:

答案 0 :(得分:3)

您需要将preg_replace更改为

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

这意味着,捕获您需要保留的内容(然后使用反向引用来恢复文本)并匹配您需要替换的内容。

请参阅regex demo

模式详情

  • (\$config\[\'website\'] = \') - 第1组捕获文字$config['website'] = '子字符串(后来引用$1
  • .*? - 除了换行符之外的任何0 +字符尽可能少
  • (\';) - 第2组:'后跟;(稍后引用$2

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

答案 1 :(得分:2)

我有一个更好,更快,更精简的解决方案。不需要捕获组,只需要小心注意转义单引号:

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

\K表示“在这里开始全字符串匹配”,这与否定的字符类([^']+)相结合,可以省略捕获组。

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