2011-09-27 64 views
3

我需要更改150個PHP文件(將ereg更新爲preg_match)。我厭倦手動更新它們,但它需要時間,我想確保我所有的替換件都能在第一時間工作。我能做些什麼來做這種手術?全局替換ereg(i)(_ replace)

這裏是我的額日格的一些例子(我)

if(eregi("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$", $ip)) { /* ... */} 
if (eregi($regexp, $label, $match)) { /* ... */} 
$string = eregi_replace("[[:space:]]+", ' ', $string); 

感謝

+0

這些文件的操作系統是什麼? –

+0

@JonathanM:CentOS – Tech4Wilco

+0

@JasonMcCreary是的,這就是爲什麼我問這個問題==> **將ereg更新爲preg_match ** – Tech4Wilco

回答

12
#!/bin/bash 
perl -p -i -e "s/eregi_replace *\\(*\"([^\@]+?)(?<\!\\\\)\", */preg_replace(\"\@\\1\@i\", /g" $1 
perl -p -i -e "s/eregi_replace *\\(*\'([^\@]+?)(?<\!\\\\)\', */preg_replace(\'\@\\1\@i\', /g" $1 
perl -p -i -e "s/ereg_replace *\\(*\"([^\@]+?)(?<\!\\\\)\", */preg_replace(\"\@\\1\@\", /g" $1 
perl -p -i -e "s/ereg_replace *\\(*\'([^\@]+?)(?<\!\\\\)\', */preg_replace(\'\@\\1\@\', /g" $1 
perl -p -i -e "s/eregi *\\(*\"([^\@]+?)(?<\!\\\\)\", */preg_match(\"\@\\1\@i\", /g" $1 
perl -p -i -e "s/eregi *\\(*\'([^\@]+?)(?<\!\\\\)\', */preg_match(\'\@\\1\@i\', /g" $1 
perl -p -i -e "s/ereg *\\(*\"([^\@]+?)(?<\!\\\\)\", */preg_match(\"\@\\1\@\", /g" $1 
perl -p -i -e "s/ereg *\\(*\'([^\@]+?)(?<\!\\\\)\', */preg_match(\'\@\\1\@\', /g" $1 

下面是我用一個小的bash腳本。比我更多時間的人可能會把所有這些都壓縮成更少的(1?)正則表達式,但它應該做到這一點。隨意用您的分隔符替換@。只需將它粘貼到一個文件中,chmod +x它,然後調用它,將該文件作爲參數傳遞。

如果需要使用集體,這樣的事情應該足夠了:

find /path/to/your/project -name '*.php' -exec foo {} \; 

哪裏foo是您命名的bash腳本。

注:這並不完美,所以您仍然需要手動更改任何錯過的邊緣情況,但它仍然可以爲您節省大量工作。另請注意,這可以進行就地文件編輯。

+0

如果他試圖用ereg匹配電子郵件怎麼辦?我建議使用'〜'作爲分隔符。 –

+0

變量和多行模式也不包括在內。 –

+0

不知道他在使用正則表達式來匹配他的項目中,沒有建議的分隔符比另一個更好或更差(特別是因爲我注意到他應該用他的選擇分隔符替換它)。他很可能只是將許多'〜'和沒有'@'的東西匹配起來。 – FtDRbwLXw6

0

更換實際額日格呼叫會做一個搜索的一個相當簡單的事情/替換操作。但實際上修正你的模式以包含preg需要的分隔符有點不重要。您可以輕鬆地做到:

$newcode = str_replace('eregi("', 'preg_match("/', $oldcode)); 

但你仍然必須尋找到模式結束添加一個分隔符那裏,還有i修改。而且你也必須爲ereg調用的每個變體做這個。