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