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

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

如何解决这个问题

PHP中文网
PHP中文网

认证高级PHP讲师

모든 응답(4)
巴扎黑

라우팅 주소를 저장하기 위해 트리를 사용하는 것은 어떨까요?
그림과 같이 각 상자는 Map입니다
/user/111/profile/books/222를 요청할 때 먼저 URL을 분할하세요. 🎜>['/' , '111' , 'profile' , 'books' , '222']
먼저 첫 번째 레이어에 / 노드가 있는지 검색
다음에 111 노드가 있는지 검색 두 번째 레이어, 그렇지 않은 경우 * 노드
를 입력한 다음 검색한 세 번째 레이어에 프로필 노드
가 있는지 확인하는 등

洪涛

https://github/bephp/router

이 프로젝트는 정규식을 사용하지 않고 "/"에 따라 URL을 잘라서 트리 구조로 저장합니다.

경로를 매핑하는 것은 트리를 순회하는 것과 동일하며 복잡도는 O(log n)입니다.

이 프로젝트는 PHP로 구현되었지만 코드가 매우 작습니다. 이해하기 쉬워야 합니다.

伊谢尔伦

라우팅 Dict를 유지 관리할 수 없는 이유는 무엇인가요? 값은 키에 해당하는 func

입니다.
黄舟

라우팅 시 정규 표현식이 보여주는 유연성은 다른 기술로 대체하기 어렵습니다. 일반 규칙을 사용하여 성능을 최적화할 수도 있습니다. 원리는 매우 간단합니다. 일반 규칙을 결합하고 특정 전략을 사용하여 일반 일치 결과를 기반으로 하는

을 결정합니다.

예를 들어

  • /사용자/{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...

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿