PHP で SQL 選択ステートメントを解析しようとしています。私の例はまだ不完全です。私の最終的な目標は、次のキャプチャ グループを持つことです。
- 桁
- 関数
- エイリアス
- バッククォート (`) を削除します
concat(g.col1, p.col2)を抽出できると便利です。
現在、私は次の正規表現を持っています:
(?P<column>[\w.]++(?=\s*+))(?:(?:\s++as\s++)(?P<alias>[\w]++))*
ステートメントの例: (この例には SELECT または FROM はありません。Doctrine の DBAL Querybuilder からこの DQL 文字列を抽出しています。
g.creation_dt as creatiodfasn, g.creation_dt, g.creation_dt as creation, abs(g.pkid) as pkid
これにより、列グループの次の配列が得られます。
column' =>
array (size=7)
0 => string 'g.creation_dt' (length=13)
1 => string 'g.creation_dt' (length=13)
2 => string 'g.creation_dt' (length=13)
3 => string 'abs' (length=3)
4 => string 'g.pkid' (length=6)
5 => string 'as' (length=2)
6 => string 'pkid' (length=4)
およびエイリアスの場合:
'alias' =>
array (size=7)
0 => string 'creatiodfasn' (length=12)
1 => string '' (length=0)
2 => string 'creation' (length=8)
3 => string '' (length=0)
4 => string '' (length=0)
5 => string '' (length=0)
6 => string '' (length=0)
これを手伝ってくれるREGEXの第一人者はいますか? ところで:私はPHPライブラリを見てきました:https://code.google.com/p/php-sql-parser/ これは仕事をしますが、速度が優先されるため、最初に正規表現で解決したいと考えています.
ありがとう
更新: Doctrine DBAL または ORM クエリビルダーから取得した DQL ステートメントから選択部分全体を抽出しようとしています。
ワークフロー:
- DB エンジニアは、クエリビルダーを返すサービスを作成します。(例: table.column1 を column1、table.column2 を column2、table.column3 を column3)
- JQuery Datatables バックエンドは、データテーブルの構成 (PHP クラス) をチェックし、すべてのリクエスト列 (例: column1、column2) を尋ねます。
- PHP バックエンドは、querybuilder に構成された両方の列が含まれているかどうかを確認する必要があります (これらはエイリアスです)。
- クライアント側は、エイリアス (例: column1) に基づいてフィルタリングを要求します。
- PHP バックエンドは、正しい where ステートメントを追加するために、別名 (querybuilder で定義されているように column1 を table.column1 に) 変換する必要があります。
それでおしまい :)