iT邦幫忙

0

請教 php 下的正規表示法

moni 2012-11-26 23:40:185334 瀏覽

各位前輩好,小弟近日想使用正規表示法替換一個 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

不知道是哪裡有錯,還請前輩們指點指點。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
8
andyto202
iT邦研究生 4 級 ‧ 2012-11-27 00:31:14
最佳解答

$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);
?>

執行完顯示原始碼就可以看到你要的了

moni iT邦新手 4 級 ‧ 2012-11-28 11:19:44 檢舉

謝謝,我測試可以,不過config檔還有其他 = ''; 結尾的,這樣會都替換掉。

andyto202 iT邦研究生 4 級 ‧ 2012-11-29 08:31:24 檢舉

config_global.php

<pre class="c" name="code">
<?php  
$x = file_get_contents("config_global.php");   
echo  preg_replace("/.*config\['memory'\]\['memcache'\]\['server'\] = '';/","\$_config['memory']['memcache']['server'] = '127.0.0.1';",$x);  
?>  

那這樣呢??

6
ted99tw
iT邦高手 1 級 ‧ 2012-11-27 00:12:39

"config_global.php");
echo preg_replace("/^$_config['memory'\]['redis'\]['server'\] = ''/","$_config['memory']['memcache']['server'] = '';...(恕刪)

這是一種正規軍的殺人武器嗎?暈

4
老鷹(eagle)
iT邦高手 1 級 ‧ 2012-11-27 08:16:11

正規表示法

....俺最討厭的東西~~!怒

6
bizpro
iT邦大師 1 級 ‧ 2012-11-27 10:24:23

<?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掉, 如\[

moni iT邦新手 4 級 ‧ 2012-11-28 11:20:18 檢舉

感謝~ 這個我測試沒甚麼問題 開心

moni iT邦新手 4 級 ‧ 2012-11-28 11:20:52 檢舉

不過為什麼只有 [ 要 escape, ] 不用呢

6
wiseguy
iT邦超人 1 級 ‧ 2012-11-27 12:11:49

這個問題看似簡單(事實上也很簡單啦),但有幾個容易出錯的地方要注意:

&lt;pre class="c" name="code">&lt;?php
// 使用 Nowdoc 語法,來 assign 一個具有引號、$號的變數
$str = &lt;&lt;&lt;'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 的好處是,我上面的寫法,不管你換幾次,格式都會是對的。

&lt;pre class="c" name="code">&lt;?php
// 使用 Nowdoc 語法,來 assign 一個具有引號、$號的變數
$str = &lt;&lt;&lt;'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);
?>
moni iT邦新手 4 級 ‧ 2012-11-28 11:22:27 檢舉

謝謝 wiseguy,果然是大師級的,學到很多~ 謝謝

4

我不太理解的是......
你怎麼會有用正規式去改「程式碼」這種想法?
用途?

moni iT邦新手 4 級 ‧ 2012-11-28 11:27:08 檢舉

mm 主要是因為 ... 只有這個方法 XD

我是在別人的SDK下面開發,只能用他給的函式來達成某些目的,這個例子的情況是要用正規式來替換檔案內的字串。
installatron.com/developer/apps#sr

我要發表回答

立即登入回答