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

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

如何解决这个问题

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(4)
巴扎黑

Mengapa tidak menggunakan pokok untuk menyimpan alamat penghalaan?
Seperti yang ditunjukkan dalam gambar, setiap kotak ialah Peta
Apabila anda meminta /user/111/profile/books/222, pecahkan url itu dahulu
['/' , '111' , 'profile' , 'books' , '222']
Cari pertama jika terdapat / nod dalam lapisan pertama
Kemudian cari jika terdapat 111 nod dalam lapisan kedua , jika tidak, masukkan * nod
dan kemudian semak jika terdapat nod profil
pada lapisan ketiga yang anda cari, dan seterusnya

洪涛

https://github/bephp/router

Projek ini tidak menggunakan ungkapan biasa, tetapi memotong URL mengikut "/" dan menyimpannya ke dalam struktur pokok.

Apabila memetakan laluan, ia bersamaan dengan melintasi pokok, dan kerumitannya ialah O (log n).

Projek ini dilaksanakan dalam PHP, tetapi kodnya sangat kecil. Ia sepatutnya mudah difahami.

伊谢尔伦

Mengapa Dict penghalaan tidak dapat dikekalkan? Nilai ialah fungsi

yang sepadan dengan kunci
黄舟

Fleksibiliti yang dipaparkan oleh ungkapan biasa dalam penghalaan sukar untuk digantikan dengan teknologi lain. Anda juga boleh menggunakan peraturan biasa untuk mengoptimumkan prestasi Prinsipnya sangat mudah Gabungkan peraturan biasa dan gunakan strategi tertentu untuk menentukan

yang mana berdasarkan hasil padanan biasa.

Sebagai contoh, ada

  • /pengguna/{pid}/profil

  • /berita

  • /produk/{pid}

  • /produk/{pid}/komen/{cid}

Empat laluan

Gunakan ungkapan biasa #^(?|/user/(d+)/profile|/news|/product/(d+)()|/product/(d+)/comment/(d+)())$# untuk memadankan

Apabila hasil tangkapan masing-masing termasuk 1, 0, 2, dan 3 kumpulan, kita tahu bahawa laluan pertama hingga ke-4 telah dipadankan masing-masing. Melalui beberapa kod untuk menggabungkan peraturan biasa secara automatik dan menetapkan bilangan kumpulan tangkapan => pemetaan penghalaan, berbilang peraturan biasa boleh digabungkan bersama untuk satu perlawanan

Berikut ialah helah untuk digunakan (?|) untuk menetapkan semula kumpulan tangkapan

Rujukan http://nikic.github.io/2014/0...

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!