Rumah > Soal Jawab > teks badan
如果路由都只是 url 字符串完全匹配的,我可以用 hashmap ,理想情况 O(1) 复杂度。
但是我想在 url 匹配中支持 通配符,那么最简单的实现方法,我就直接用正则了,但是匹配复杂度就变成 O(n)了,这样感觉不是很好。。。
如何解决这个问题
巴扎黑2017-04-18 09:50:46
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
PHP中文网2017-04-18 09:50:46
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.
伊谢尔伦2017-04-18 09:50:46
Mengapa Dict penghalaan tidak dapat dikekalkan? Nilai ialah fungsi
yang sepadan dengan kunci黄舟2017-04-18 09:50:46
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...