grep 経由で PHP 関数の引数を取得するにはどうすればいいですか?

grep 経由で PHP 関数の引数を取得するにはどうすればいいですか?

移行するサーバー上の各 PHP ベースの Web サイトのデータベース ログイン情報を知るためのスクリプトを作成しています。ログイン情報は通常、次のように記述されます。

$servername='localhost';
$database_username='someName';
$database_password='p@ssw0rd';
$database_name='someDatabase';

mysql_connect($servername, $database_username, $database_password);
mysql_select_db($database_name);

または、次のようになります。

$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);

スクリプトは、PHP 接続関数のいずれかを含む各行を検索します。

grep -irE "mysql_connect\|mysql_select_db\|new PDO" *

$さて、英数字以外の文字で始まって英数字以外の文字で終わる各文字列を取得するにはどうすればよいでしょうか。さらに、;画面に文字が見つからない場合は、一部のコーダーが次のように行うように、手動で処理できるように通知を受け取りたいと考えています。

$pdo = new PDO("mysql: host={$servername};
                dbname={$$database_name}",
                $database_username,
                $database_password
               );

これらのトークン (PHP 変数) を取得したら、その値を取得するために、ファイルで再度トークンを grep で検索します。

答え1

ここで何をしようとしているのかよく分かりませんが、次のようにして「英数字以外の文字grepで始まり、英数字以外の文字で終わるすべての文字列」を取得できます。$

grep -oP '\$.+?\W' 

あなたのコメントへの返答としては、次のようなものはどうでしょうか:

for f in `find . -name "*.php"`; do \
  echo "----- $f -----";
  for s in $(grep -iE "mysql_connect|mysql_select_db|new PDO" $f | 
     grep  -oP '\$\w+?\W' | sed 's/.$//' | sort | uniq); do \
       grep -m 1 $s $f; 
 done; 
done

このスクリプトレットは、すべての .php ファイルを検索し、各ファイルで目的の変数を grep で検索し、見つかったファイル内の各変数の最初のインスタンスを出力します。たとえば、2 つの .php ファイルと を作成したとします。aa.phpそのbb.php内容は次のとおりです。

$ cat aa.php 
$servername='localhost';
$database_username='someName';
$database_password='p@ssw0rd';
$database_name='someDatabase';
mysql_connect($servername, $database_username, $database_password);
mysql_select_db($database_name);

$ cat bb.php 
$servername='localhost2';
$database_username='some2Name';
$database_password='p@ssw0rd2';
$database_name='someDatabase2';
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);

上記のスクリプトの出力は次のとおりです。

----- ./bb.php -----
$database_name='someDatabase2';
$database_password='p@ssw0rd2';
$database_username='some2Name';
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);
$servername='localhost2';
----- ./aa.php -----
$database_name='someDatabase';
$database_password='p@ssw0rd';
$database_username='someName';
$servername='localhost';

関連情報