我有内容的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
正如您所看到的,它不属于匹配信息的第2组。
我想要的只是改变第2组。一个具体的事情。
最后在脚本之后它将如下所示:
fggfhfghfghf
$config['website'] = 'aaaaaa';
asdasdasdasdasdas
答案 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