1

私は PHP で書かれたデータベース クラスを持っています。これらの機能の 1 つは、MySQL の AES 関数でエンコードされた列の復号化を処理することです。
これは通常のケースでは完璧に機能します (これは、クエリ文字列 "AS bla_bla" にエイリアスがないことを意味します)。私の正規表現は列だけでなくエイリアスもラップするため、スクリプトが復号化する列の名前を含むエイリアスを含むクエリ文字列を誰かが書いたとしましょう。それは本来あるべき姿ではありません。

これは私が書いた正規表現です:

preg_replace("/(((\`|)\w+(\`|)\.|)[encrypted|column|list])/i", "AES_DECRYPT(${0},'the hash')"

グレーブ アクセントの部分が存在するのは、クエリにグレーブ アクセントの内側にあるかどうかにかかわらず、テーブル名が含まれている場合があるためです。

入力例:

SELECT encrypted, something AS 'a_column' FROM a_table;

出力例:

SELECT AES_DECRYPT(encrypted, 'the hash'), something AS 'a_AES_DECRYPT(column, 'the hash')' FROM a_table;

ご覧のとおり、これはうまくいかないので、特殊文字または空白が現れるまで「as」という単語の直後にない単語のみを検索することを考えました。もちろん、何時間も試してみましたが、正しい構文が得られません。

これを純粋な正規表現で解決することは可能ですか?

4

1 に答える 1

1

これで始められるはずです:

$quoted_name = '(\w+|`\w+`|"\w+"|\'\w+\')';
preg_match("/^SELECT ((, )?$quoted_name( AS $quoted_name)?)* FROM $quoted_name;$/", "SELECT encrypted, something AS 'a_column' FROM a_table;", $m);
var_dump($m);

交換部品は、var_dump を調べた後、書き込みを簡単に見つけられるはずです。

于 2012-05-17T20:15:13.993 に答える