2011-09-27 60 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调用的每个变体做这个。