3

150 以上の PHP ファイルを変更する必要があります (ereg を preg_match に更新)。それらを手動で更新するのはうんざりですが、それには時間がかかります。すべての置換が初めて機能することを確認したいと思います。この種の操作を行うにはどうすればよいですか?

これが私の ereg(i) の例です

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

ありがとう

4

2 に答える 2

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 {} \;

foobashスクリプトに名前を付けたものはどこにありますか。

注:これは完全ではないため、見逃したフリンジケースを手動で変更する必要がありますが、それでも多くの作業を節約できます。また、これはインプレースのファイル編集を行うことに注意してください。

于 2011-09-27T20:55:34.483 に答える
0

実際の ereg 呼び出しを置き換えることは、検索/置換操作を行うというかなり単純な問題です。しかし、実際に preg が必要とする区切り文字を含めるようにパターンを修正することは、やや重要です。あなたは簡単に行うことができます:

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

iただし、修飾子だけでなく、区切り文字を追加するためにパターンの終了位置を見つける必要があります。また、ereg 呼び出しのすべてのバリアントに対してもこれを行う必要があります。

于 2011-09-27T20:52:32.607 に答える