84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
如果路由都只是 url 字符串完全匹配的,我可以用 hashmap ,理想情况 O(1) 复杂度。但是我想在 url 匹配中支持 通配符,那么最简单的实现方法,我就直接用正则了,但是匹配复杂度就变成 O(n)了,这样感觉不是很好。。。
如何解决这个问题
认证高级PHP讲师
ルーティング アドレスを保存するためにツリーを使用してみてはいかがでしょうか?図に示すように、各ボックスはマップです/user/111/profile/books/222 をリクエストするときは、最初に URL を分割してください['/' , '111' , 'profile' , 'books' , '222']まず最初の層に / ノードがあるかどうかを検索します次に 111 ノードがあるかどうかを検索します2 番目のレイヤーにない場合は、 * ノード を入力し、検索した 3 番目のレイヤーにプロファイル ノード があるかどうかを確認します。
https://github/bephp/router
このプロジェクトは正規表現を使用せず、URLを「/」で切り取ってツリー構造に保存します。
ルートをマッピングする場合、それはツリーを横断することと等価であり、複雑さは O (log n) です。
プロジェクトは PHP で実装されていますが、コードは非常に小さいです。理解しやすいはずです。
ルーティング辞書を維持できないのはなぜですか?値はキーに対応する func
ルーティングにおける正規表現によって示される柔軟性は、他のテクノロジーで置き換えるのが困難です。通常のルールを使用してパフォーマンスを最適化することもできます。原理は非常に簡単で、通常のルールを組み合わせて、どの
たとえば、
/user/{pid}/profile
/ニュース
/product/{pid}
/product/{pid}/comment/{cid}
4つのルート
正規表現 #^(?|/user/(d+)/profile|/news|/product/(d+)()|/product/(d+)/comment/(d+)())$# を使用して
#^(?|/user/(d+)/profile|/news|/product/(d+)()|/product/(d+)/comment/(d+)())$#
キャプチャ結果にそれぞれ 1、0、2、3 グループが含まれている場合、1 番目から 4 番目のルートがそれぞれ一致したことがわかります。正規表現を何らかのコードと自動的にマージし、キャプチャ グループ => ルーティング マッピングの数を割り当てることで、複数の正規表現を 1 つの一致に対してマージできます
ここでは、(?|) を使用してキャプチャ グループをリセットする方法を紹介します
(?|)
参考 http://nikic.github.io/2014/0...
ルーティング アドレスを保存するためにツリーを使用してみてはいかがでしょうか?
というように続きます。図に示すように、各ボックスはマップです
/user/111/profile/books/222 をリクエストするときは、最初に URL を分割してください
['/' , '111' , 'profile' , 'books' , '222']
まず最初の層に / ノードがあるかどうかを検索します
次に 111 ノードがあるかどうかを検索します2 番目のレイヤーにない場合は、 * ノード
を入力し、検索した 3 番目のレイヤーにプロファイル ノード
があるかどうかを確認します。
https://github/bephp/router
このプロジェクトは正規表現を使用せず、URLを「/」で切り取ってツリー構造に保存します。
ルートをマッピングする場合、それはツリーを横断することと等価であり、複雑さは O (log n) です。
プロジェクトは PHP で実装されていますが、コードは非常に小さいです。理解しやすいはずです。
ルーティング辞書を維持できないのはなぜですか?値はキーに対応する func
ですルーティングにおける正規表現によって示される柔軟性は、他のテクノロジーで置き換えるのが困難です。通常のルールを使用してパフォーマンスを最適化することもできます。原理は非常に簡単で、通常のルールを組み合わせて、どの
が通常の一致結果に基づいて決定されるかということです。たとえば、
があります。/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...