Вы можете использовать
$search_field_pattern = "/\bdata\[SearchForm]\[(\w+)]/i";
if(preg_match($search_field_pattern, "data[SearchForm][somestringhere]", $m)) {
echo $m[1]; // => somestringhere
}
См. PHP demo
Шаблон соответствует
\b
- граница слова data\[SearchForm]\[
- буквальная строка data[SearchForm][
(примечание [
экранировано, чтобы соответствовать символам [
) (\w+)
- группа захвата 1 : один или несколько символов слова ]
- символ ]
. Третий аргумент preg_match
, $m
будет содержать результаты , Поскольку необходимая подстрока захватывается в группу 1, значение извлекается с помощью $m[1]
.
Чтобы получить последнюю подстроку внутри квадратных скобок, вы можете использовать
if(preg_match("~\[(\w+)](?!.*\[\w+])~s", "data[SearchForm][somestringhere]", $m)) {
echo $m[1]; // => somestringhere
}
См. this PHP demo .
Чтобы получить второй, используйте
if(preg_match("~\[\w+].*?\[(\w+)]~s", "data[SearchForm][somestringhere]", $m)) {
echo $m[1]; // => somestringhere
}
В частности, по вашему вопросу:
можно ли перенаправить маршрут без параметров запроса на маршрут с параметрами запроса?
blockquote>Не думаю, что это может сработать поскольку ? в запросе есть разделитель, который не является частью строки запроса URL.
Альтернатива 1 - поскольку вы используете ngrx, один из способов сделать это - использовать пользовательский сериализатор. Документы с сайта ngrx.io показывают пример возврата параметров с сериализацией. Здесь вы можете добавить логику, чтобы добавить параметры по умолчанию, если они не существуют. Я откажусь от того, что это может быть менее идеальным, потому что оно срабатывает на каждом маршруте, но может упростить ваши маршруты.
import { Params, RouterStateSnapshot } from '@angular/router'; import { RouterStateSerializer } from '@ngrx/router-store'; export interface RouterStateUrl { url: string; params: Params; queryParams: Params; } export class CustomSerializer implements RouterStateSerializer<RouterStateUrl> { serialize(routerState: RouterStateSnapshot): RouterStateUrl { let route = routerState.root; while (route.firstChild) { route = route.firstChild; } const { url, root: { queryParams }, } = routerState; const { params } = route; // Add here if (<insert url logic> && queryParams.page === undefined) { queryParams.page = 0; } // Only return an object including the URL, params and query params // instead of the entire snapshot return { url, params, queryParams }; } }
Альтернатива 2 - Вы можете обернуть HttpClient или, что более предпочтительно, создать общий метод списка страниц, который проверяет это и добавляет его в запрос, если страницы нет. Этот ответ показывает пример того, как добиться добавления параметров.
Альтернатива 3 - Вы можете использовать страницу как часть пути и выполнять обходные пути / изменения по мере необходимости для генерации ваших запросов.
{ path: 'user/:userId/agent', redirectTo: '/user/:userId/agent/0', pathMatch: 'full' }, { path: 'user/:userId/agent/:page', component: AgentListComponent },