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

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

如何解决这个问题

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(4)
巴扎黑

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

洪涛

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.

伊谢尔伦

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

correspondant à la clé
黄舟

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!