Maison > Questions et réponses > le corps du texte
如果路由都只是 url 字符串完全匹配的,我可以用 hashmap ,理想情况 O(1) 复杂度。
但是我想在 url 匹配中支持 通配符,那么最简单的实现方法,我就直接用正则了,但是匹配复杂度就变成 O(n)了,这样感觉不是很好。。。
如何解决这个问题
巴扎黑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
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.
伊谢尔伦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é黄舟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...