0

そのため、有効な列名に適切なテーブルプレフィックス (「t.」または「r.」など) を自動的に追加するスクリプトを作成しようとしています。

$t_columns = array('id', 'name', 'label');
$r_columns = array('related_value');

入力:

id > 1 AND (name = 'Hello' OR label IN ('World', 'Planet name AND label')) AND (related_value > 1 AND related_value < 50)

出力:

t.id > 1 AND (t.name = 'Hello' OR t.label IN ('World', 'Planet name AND label')) AND (r.related_value > 1 AND r.related_value < 50)

通常のstr_replaceを実行できないことに注意してください。すべてのテーブル名が適切に先頭に追加されるようにするための最も単純なコード (私はpreg_replaceと推測しています) は何でしょうか?

4

3 に答える 3

1

数秒考えた後、私がそれに取り組む方法は次のとおりです。

文字列を 1 文字ずつ調べて一重引用符を探しますが、エスケープされた文字はスキップします。エスケープされていない 2 つの単一引用符 (つまり、文字列) の間のものは、一意のトークンに置き換えられ、そのトークンをキーとして、元の文字列を値として、連想配列に入れられます。

文字列が邪魔にならないようになったので、既知の列名に対して a str_replace()(またはpreg_replace()、必要に応じて ) を実行します。おそらく、テーブルのエイリアスをキーとして、値を列名を含む列挙型配列として、列名を連想配列に構築します。このようにして、交換を自動化できます。

テーブル名が入力されたら、str_replace()トークンに対して a を実行して、元の文字列を元の場所に戻すだけで完了です。

誰かが、これらすべてを 1 回のヒットで実行するために、非常に素晴らしい (そしておそらく保守不可能に近い) 正規表現を作成する可能性があると確信しています。しかし、正規表現が実際に適切なツールである状況でのみ正規表現を使用することを好みます。CFL がより適している場合ではありません。

于 2009-01-17T20:52:24.560 に答える
0

ここで正規表現が良いアイデアかどうかはわかりません。PHPで検証を自分で実行するために、計算の複雑さが最小限に抑えられるだけの価値があると思います。そうすれば、データベースに変更が必要になった場合でも、正規表現の堅牢性を高める方法について頭を悩ませる必要はありません。

Jamie Zawinski はかつてこう言いました。今、彼らは2つの問題を抱えています。」

適切なデータベースで作業していることを確認するワークフローを作成するという点では、オブジェクト指向のアプローチを取ることを検討します。T および R テーブルのクラスは、正規表現ではなく、同じメソッド内の条件付きロジックを使用して正しいテーブル型オブジェクトを構築する役割を持つモデル クラスのインスタンス化された子にすることができます。

于 2009-01-17T20:58:41.817 に答える
0

これは多くの方法で行うことができ、正規表現を使用することもできます。個人的には配列アプローチを使用します。まず、マングリング テーブルを次のように定義します。

$table = array(
    'id' => 't.id',
    'name' => 't.name',
    'label' => 't.label',
    'related_value' => 'r.related_value'
);

これにより、 str_replace() 呼び出しがはるかに簡単になります。

function mangling(&$v, $k, $table)
{
    if (($k & 1) == 0)
        $v = str_replace(array_keys($table), array_values($table), $v);
}

$spans = explode("'", ' ' . $input);
array_walk($spans, 'mangling', $table);
$output = implode("'", $spans);
于 2009-10-09T18:09:56.920 に答える