2

セカンダリアプリケーションとリンクするために、正規表現を使用して(Symfonyアプリケーションからの)DSNを解析しようとしていますが、同じデータベースを使用しています。

私が現在持っているDSNは次のとおりです。

mysql:dbname=my_db_name;host=localhost

正規表現:

/^(\w+):(dbname=(\w+))?;?(host=(\w+))?/

(を使用preg_match())。これはOKと一致しますが、DSN要素が入れ替わっているため、テスト環境では失敗します。

mysql:host=localhost;dbname=my_testdb_name

はい、それらを切り替えることもできますが、両方のDSNからホストとdbnameの部分を抽出することは、単一の正規表現で可能であると確信しています。同時に知識を強化できるようにしたいと思います。時間;-)これを行う方法はありますか?

4

2 に答える 2

1

次の式は、2つのDSNに一致する可能性があります

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/

ただし、mysql:host = localhost; host=localhostにも一致する可能性があります...

于 2010-04-23T13:41:34.930 に答える
1

';'で文字列を分割します 次に、分割文字列の各部分で、関心のある各部分に個別のregexを使用します。

正規表現がどちらの方向にも一致するようにしようとすると、おそらく少しやり過ぎであり、チェックする3番目または4番目のものを追加するとすぐに制御不能になります。

実際、文字列を実際に分割せずに逃げることができるかもしれません。

編集:

ああ、質問を読み直してください。この文字列は長い文字列の一部のようです。

だからあなたはこれを行うことができます

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/

これは次のように減らすことができます:

    /^(\w+):((dbname|host)=(\w+));?+

正規表現のフレーバーを調整する必要があるかもしれません。私は.netにしか慣れていません。

于 2010-04-23T13:34:45.557 に答える