如果路由都只是 url 字符串完全匹配的,我可以用 hashmap ,理想情况 O(1) 复杂度。
但是我想在 url 匹配中支持 通配符,那么最简单的实现方法,我就直接用正则了,但是匹配复杂度就变成 O(n)了,这样感觉不是很好。。。
如何解决这个问题
巴扎黑2017-04-18 09:50:46
라우팅 주소를 저장하기 위해 트리를 사용하는 것은 어떨까요?
그림과 같이 각 상자는 Map입니다
/user/111/profile/books/222를 요청할 때 먼저 URL을 분할하세요. 🎜>['/' , '111' , 'profile' , 'books' , '222']
먼저 첫 번째 레이어에 / 노드가 있는지 검색
다음에 111 노드가 있는지 검색 두 번째 레이어, 그렇지 않은 경우 * 노드
를 입력한 다음 검색한 세 번째 레이어에 프로필 노드
가 있는지 확인하는 등
PHP中文网2017-04-18 09:50:46
https://github/bephp/router
이 프로젝트는 정규식을 사용하지 않고 "/"에 따라 URL을 잘라서 트리 구조로 저장합니다.
경로를 매핑하는 것은 트리를 순회하는 것과 동일하며 복잡도는 O(log n)입니다.
이 프로젝트는 PHP로 구현되었지만 코드가 매우 작습니다. 이해하기 쉬워야 합니다.
黄舟2017-04-18 09:50:46
라우팅 시 정규 표현식이 보여주는 유연성은 다른 기술로 대체하기 어렵습니다. 일반 규칙을 사용하여 성능을 최적화할 수도 있습니다. 원리는 매우 간단합니다. 일반 규칙을 결합하고 특정 전략을 사용하여 일반 일치 결과를 기반으로 하는
을 결정합니다.예를 들어
/사용자/{pid}/프로필
/뉴스
/product/{pid}
/product/{pid}/comment/{cid}
4개 노선
정규 표현식#^(?|/user/(d+)/profile|/news|/product/(d+)()|/product/(d+)/comment/(d+)())$#
을 사용하여
캡처 결과에 각각 1, 0, 2, 3개의 그룹이 포함되어 있으면 각각 1~4번 경로가 일치되었음을 알 수 있습니다. 정규식을 일부 코드와 자동으로 병합하고 캡처 그룹 수 => 라우팅 매핑을 할당하면 여러 정규식을 하나의 일치 항목으로 병합할 수 있습니다
다음은 (?|)
을 사용하여 캡처 그룹을 재설정하는 요령입니다
참고 http://nikic.github.io/2014/0...