java - 如何编写一个web 框架的 url 路由
PHP中文网
PHP中文网 2017-04-18 09:48:46
0
4
482

如果路由都只是 url 字符串完全匹配的,我可以用 hashmap ,理想情况 O(1) 复杂度。
但是我想在 url 匹配中支持 通配符,那么最简单的实现方法,我就直接用正则了,但是匹配复杂度就变成 O(n)了,这样感觉不是很好。。。

如何解决这个问题

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(4)
巴扎黑

ルーティング アドレスを保存するためにツリーを使用してみてはいかがでしょうか?
図に示すように、各ボックスはマップです
/user/111/profile/books/222 をリクエストするときは、最初に URL を分割してください
['/' , '111' , 'profile' , 'books' , '222']
まず最初の層に / ノードがあるかどうかを検索します
次に 111 ノードがあるかどうかを検索します2 番目のレイヤーにない場合は、 * ノード
を入力し、検索した 3 番目のレイヤーにプロファイル ノード
があるかどうかを確認します。

というように続きます。
いいねを押す +0
洪涛

https://github/bephp/router

このプロジェクトは正規表現を使用せず、URLを「/」で切り取ってツリー構造に保存します。

ルートをマッピングする場合、それはツリーを横断することと等価であり、複雑さは O (log n) です。

プロジェクトは PHP で実装されていますが、コードは非常に小さいです。理解しやすいはずです。

いいねを押す +0
伊谢尔伦

ルーティング辞書を維持できないのはなぜですか?値はキーに対応する func

です
いいねを押す +0
黄舟

ルーティングにおける正規表現によって示される柔軟性は、他のテクノロジーで置き換えるのが困難です。通常のルールを使用してパフォーマンスを最適化することもできます。原理は非常に簡単で、通常のルールを組み合わせて、どの

が通常の一致結果に基づいて決定されるかということです。

たとえば、

があります。
  • /user/{pid}/profile

  • /ニュース

  • /product/{pid}

  • /product/{pid}/comment/{cid}

4つのルート

正規表現 #^(?|/user/(d+)/profile|/news|/product/(d+)()|/product/(d+)/comment/(d+)())$# を使用して

と一致させます

キャプチャ結果にそれぞれ 1、0、2、3 グループが含まれている場合、1 番目から 4 番目のルートがそれぞれ一致したことがわかります。正規表現を何らかのコードと自動的にマージし、キャプチャ グループ => ルーティング マッピングの数を割り当てることで、複数の正規表現を 1 つの一致に対してマージできます

ここでは、(?|) を使用してキャプチャ グループをリセットする方法を紹介します

参考 http://nikic.github.io/2014/0...

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート