2017-07-05 49 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