@@ -141,30 +141,21 @@ private function skimUri(string $uri): string
141141 if (false === $ parsedUrl = parse_url ($ uri )) {
142142 throw new InvalidArgumentException (sprintf ('The given MongoDB Connection URI "%s" is invalid. ' , $ uri ));
143143 }
144-
145- $ query = [];
146- if (isset ($ parsedUrl ['query ' ])) {
147- parse_str ($ parsedUrl ['query ' ], $ query );
148- }
149-
150- if (isset ($ query ['collection ' ])) {
151- $ this ->options ['collection ' ] = $ query ['collection ' ];
152- $ queryStringPos = strrpos ($ uri , $ parsedUrl ['query ' ]);
153- unset($ query ['collection ' ]);
154- $ prefix = substr ($ uri , 0 , $ queryStringPos );
155- $ newQuery = http_build_query ($ query , '' , '& ' , PHP_QUERY_RFC3986 );
156- if (empty ($ newQuery )) {
157- $ prefix = rtrim ($ prefix , '? ' );
158- }
159- $ suffix = substr ($ uri , $ queryStringPos + \strlen ($ parsedUrl ['query ' ]));
160- $ uri = $ prefix .$ newQuery .$ suffix ;
161- }
162-
163144 $ pathDb = ltrim ($ parsedUrl ['path ' ] ?? '' , '/ ' ) ?: null ;
164145 if (null !== $ pathDb ) {
165146 $ this ->options ['database ' ] = $ pathDb ;
166147 }
167148
149+ $ matches = [];
150+ if (preg_match ('/^(.*[\?&])collection=([^&#]*)&?(([^#]*).*)$/ ' , $ uri , $ matches )) {
151+ $ prefix = $ matches [1 ];
152+ $ this ->options ['collection ' ] = $ matches [2 ];
153+ if (empty ($ matches [4 ])) {
154+ $ prefix = substr ($ prefix , 0 , -1 );
155+ }
156+ $ uri = $ prefix .$ matches [3 ];
157+ }
158+
168159 return $ uri ;
169160 }
170161
0 commit comments