2013-12-17 4 views
1

Я пытаюсь сопоставить свое приложение uri с набором маршрутов, и для маршрута по умолчанию я думал о разрешении bb.com/home или bb.com/ (пусто), чтобы быть разрешенными параметрами на первом сегменте uri , и то же самое для второго. Я не уверен, как я проверяю для пустых значений является лучшим:PHP PCRE - матч «ничего»

#^/?(?P<controller>([.*]{0}|home))(?:/(?P<action>([.*]{0}|test)))?/?$#uD 

Обратите внимание на[.*]{0}

Есть ли лучший способ сделать это?

+3

Вы могли бы сделать это ленивым: '. *?', Который ни в коем случае не должен ничего сопоставлять. –

+1

Это сработало и короче моего подхода. – yoda

+0

Кроме того, вам не нужно иметь так много групп захвата. У вас даже есть группа захваченных номеров в названной группе захвата. Вот как я напишу выражения: '^ /? (? P . *? | Home)/(? P . *?) /? $' –

ответ

2

Вы можете сделать это ленивым: .*?, который ни в коем случае не должен ничего сопоставлять.


Кроме того, вам не обязательно иметь так много групп захвата. У вас даже есть группа захваченных номеров в названной группе захвата. Это, как я хотел бы написать выражение:

^/?(?P<controller>.*?|home)/(?P<action>.*?|test)/?$

Это сохраняет две именованные группы захвата, но избавляется от вложенной пронумерованных группы захвата, а также не-захватив группу, которая не была необходима.

2

Размещая .* внутри класса символов [] вы просите, чтобы соответствовать буквальной точке . и буквальный * вместо точки в состоянии соответствовать любому символу (кроме символа новой строки) и * возможности выступать в качестве квантора.

Используя квантификатор диапазона {0}, это соответствует точно 0 раз (token is being ignored). Вы не получите ожидаемых результатов, и их тоже не нужно делать.

Вы можете просто добавить ? для нежирного матча и удалить здесь лишние группы захвата.

~^/?(?P<controller>.*?|home)/(?P<action>.*?|test)/?$~i 

Однако думать о том, как это может работать, вы сказали, что вы хотели, чтобы bb.com/home, а это также будет соответствовать модели, которые вы, возможно, не хотят.

Смежные вопросы