各位前輩好,小弟近日想使用正規表示法替換一個 config 檔,遇到瓶頸卡了很久想請前輩指點:
config 檔有個:
$_config['memory']['memcache']['server'] = '';
想換成:
$_config['memory']['memcache']['server'] = '127.0.0.1';
我嘗試:
$x = file_get_contents("config_global.php");
echo preg_replace("/^$_config['memory'\]['redis'\]['server'\] = ''/","$_config['memory']['memcache']['server'] = '';",$x);
出現:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in config_global_re.php on line 1
不知道是哪裡有錯,還請前輩們指點指點。
$x = file_get_contents("config_global.php");
echo preg_replace("/^$_config['memory'\]['redis'\]['server'\] = ''/","$_config['memory']['me...(恕刪)
<pre class="c" name="code">
<?php
$x = file_get_contents("config_global.php");
echo preg_replace("/.* = '';/","\$_config['memory']['memcache']['server'] = '127.0.0.1';",$x);
?>
執行完顯示原始碼就可以看到你要的了
"config_global.php");
echo preg_replace("/^$_config['memory'\]['redis'\]['server'\] = ''/","$_config['memory']['memcache']['server'] = '';...(恕刪)
這是一種正規軍的殺人武器嗎?
<?php
$x=file_get_contents("config_global.php");
echo preg_replace("/_config\['memory']\['memcache']\['server'] = '';/","_config['memory']['memcache']['server'] = '127.0.0.1';",$x);
?>
[之前要escape掉, 如\[
這個問題看似簡單(事實上也很簡單啦),但有幾個容易出錯的地方要注意:
<pre class="c" name="code"><?php
// 使用 Nowdoc 語法,來 assign 一個具有引號、$號的變數
$str = <<<'TXT'
$_config['memory']['memcache']['server'] = '
TXT;
// 除非你 RegExp熟到不行,要不然不知道保留字是哪些
// 使用 preg_quote() 來處理 RegExp 樣板,把保留字跳脫
// 再用小括號來取回比對樣版,以免多打一次,多一次錯誤機會
$pattern = '/(' . preg_quote($str, '/') . ").*(';)/";
$source = file_get_contents('config.php');
// 用 \1, \2 來取回原設定值。但是因為 \1 跟後面的 127 接在一起
// 會被誤以為要取 /11,所以插一個 \10 這個不存在的值來隔開
$destination = preg_replace($pattern, '\1\10127.0.0.1\2', $source);
echo $destination;
file_put_contents('config.php', $destination);
?>
不過,這個例子是取代固定字串,根本可以不用 RegExp 的。只不過,用 RegExp 的好處是,我上面的寫法,不管你換幾次,格式都會是對的。
<pre class="c" name="code"><?php
// 使用 Nowdoc 語法,來 assign 一個具有引號、$號的變數
$str = <<<'TXT'
$_config['memory']['memcache']['server'] = '';
TXT;
$source = file_get_contents('config.php');
// 用 substr() 避免寫兩次,以後修改很容易改了一個忘了改另外一個
$destination = str_replace($str, substr($str, 0, 44). "127.0.0.1';", $source);
echo $destination;
file_put_contents('config.php', $destination);
?>
我不太理解的是......
你怎麼會有用正規式去改「程式碼」這種想法?
用途?