Rumah  >  Soal Jawab  >  teks badan

java - 如何编写一个web 框架的 url 路由

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

如何解决这个问题

PHP中文网PHP中文网2741 hari yang lalu469

membalas semua(4)saya akan balas

  • 巴扎黑

    巴扎黑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

    balas
    0
  • PHP中文网

    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.

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:50:46

    Mengapa Dict penghalaan tidak dapat dikekalkan? Nilai ialah fungsi

    yang sepadan dengan kunci

    balas
    0
  • 黄舟

    黄舟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...

    balas
    0
  • Batalbalas