recherche

Maison  >  Questions et réponses  >  le corps du texte

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

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

如何解决这个问题

PHP中文网PHP中文网2809 Il y a quelques jours493

répondre à tous(4)je répondrai

  • 巴扎黑

    巴扎黑2017-04-18 09:50:46

    Pourquoi ne pas utiliser un arbre pour stocker les adresses de routage ?
    Comme le montre l'image, chaque case est une carte
    Lorsque vous demandez /user/111/profile/books/222, divisez d'abord l'URL
    🎜>['/' , '111' , 'profile' , 'books' , '222']
    Recherchez d'abord s'il y a un nœud / dans la première couche
    Recherchez ensuite s'il y a un nœud 111 dans la deuxième couche, sinon, entrez le nœud *
    puis vérifiez s'il y a un nœud de profil
    sur la troisième couche que vous avez recherchée, et ainsi de suite

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 09:50:46

    https://github/bephp/router

    Ce projet n'utilise pas d'expressions régulières, mais coupe l'URL selon "/" et l'enregistre dans une arborescence.

    Lors de la cartographie d'itinéraires, cela équivaut à parcourir l'arbre, et la complexité est O (log n).

    Le projet est implémenté en PHP, mais le code est très petit. Cela devrait être facile à comprendre.

    répondre
    0
  • 伊谢尔伦

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

    Pourquoi un dict de routage ne peut-il pas être maintenu ? La valeur est la func

    correspondant à la clé

    répondre
    0
  • 黄舟

    黄舟2017-04-18 09:50:46

    La flexibilité affichée par les expressions régulières dans le routage est difficile à remplacer par d'autres technologies. Vous pouvez également utiliser des règles régulières pour optimiser les performances. Le principe est très simple. Combinez des règles régulières et utilisez une certaine stratégie pour déterminer laquelle

    est basée sur les résultats de correspondance réguliers.

    Par exemple, il y a

    • /user/{pid}/profile

    • /actualités

    • /product/{pid}

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

    Quatre itinéraires

    Utilisez une expression régulière #^(?|/user/(d+)/profile|/news|/product/(d+)()|/product/(d+)/comment/(d+)())$# pour faire correspondre

    Lorsque les résultats de capture incluent respectivement 1, 0, 2 et 3 groupes, nous savons que les 1er au 4ème itinéraires ont respectivement été mis en correspondance. Grâce à du code pour fusionner automatiquement les règles régulières et attribuer le nombre de groupes de capture => mappage de routage, plusieurs règles régulières peuvent être fusionnées pour une seule correspondance

    Voici une astuce à utiliser (?|) pour réinitialiser le groupe de capture

    Référence http://nikic.github.io/2014/0...

    répondre
    0
  • Annulerrépondre