2013-06-12 85 views
0

我一直在爲我的PHP項目使用Codeigniter,並且我一直在使用他們的會話類。Perl搜索並替換保留字符串的中間部分

$this->session->userdata('variablename') 

我一直有很多問題,所以我決定使用PHP本機會話。

$_SESSION['variablename'] 

這是我有這麼遠

perl -p -i -e "s/$this->session->userdata('.*?$SOMEVAR.*?\')/$_SESSION['$1']/g" offer.php 

但真相被告知我真的不知道我在做什麼。

我也想對我的項目中的所有php文件做這個。

非常感謝。

+0

第一個'$'是一個specail正則表達式字符,用於行尾......當你想匹配一個實際的'$'字符時,你需要將其轉義爲'\ $'...同樣用於'('或') 'chars 's | \ $ this-> session-> userdata \((。*)\)| $ _SESSION ['$ 1'] | g' – gbtimmon

+0

您是否在引用區域內使用了單引號? – TLP

回答

0

正則表達式應該是:

s/\$this->session->userdata\('(.?)'\)/$_SESSION['$1']/g

與您發佈的版本問題大多與聯合國轉義字符 - 您可以通過字符\之前將逃脫$或括號。例如,\$this將找到文本「$ this」,而$this將搜索$this變量的值。

要更全面地瞭解逃逸(和其他快速提示),如果您有$ 2,我強烈建議this cheat sheet

而且,你不需要使用你在裏面添加​​結構... Perl會自動捕捉第一對括號之間發現的結果並將其存儲在$1,第二組括號得到$2,等等。

0

當shell引用變得越來越複雜時,最簡單的做法就是將源代碼放入一個文件中。您仍然可以將其用作單線程。我已經使用了負向前視斷言來確保它不會因爲字符串中的轉義單引號而中斷。

# source file, regex.txt 
s/\$this->session->userdata\('(.+?)(?!\\')'\)/\$_SESSION['$1']/g; 

用法:

perl -pi regex.txt yourfile.php 

注意,你只是離開了-e開關。還請注意,-i需要Windows的備份擴展,例如-i.bak