preg_match - regex - различать именованный подшаблон и шаблон, начинающийся с той же строки - PullRequest
2 голосов
/ 30 декабря 2011

Я нахожусь в процессе создания своего собственного класса маршрутизатора URL для облегченной инфраструктуры MVC. Я реализовывал простую систему, основанную на массивах, и выяснил, какие параметры в серии циклов и т. Д. Я прошел книгу django, и мне нравится их система простого сопоставления с шаблоном и вызова класса и метода, если шаблон соответствует. У меня это работает хорошо, но я застрял на картировании двух разных шаблонов, и по общему признанию я не лучший в регулярных выражениях.

поэтому у меня есть массив шаблонов URL и соответствующих классов / методов:

'/^\/users\/(?P<username>\w+)$/' => array('class' => 'userController', 'method' => 'detailUserAction'),

'/^\/users\/update$/' => array('class' => 'userController', 'method' => 'updateUserAction'), 

и первый шаблон всегда сопоставляется с чем-либо еще, начинающимся с / users и имеющим что-то еще после него.

Позже в коде я перебираю массив и выполняю этот код:

if (preg_match($urlPattern, $pathString, $matches)){
                $this->invokeObject($command, $matches);
                exit;
            }

Любые идеи о том, какой шаблон я могу использовать, чтобы различать эти два URL-адреса?

один - / пользователи / имя пользователя

, а другой - / users / update

Полагаю, я всегда могу сначала включить остальные в порядке в массиве, это мой лучший вариант?

1 Ответ

0 голосов
/ 21 января 2012

Я думаю, что дизайн URI должен быть улучшен в этом случае.Что если пользователя называют «обновить», «добавить» или «удалить»?Это добавит особые случаи в ваш шаблон имени пользователя и не будет легко поддерживать / расширять в будущем.

Но если это означает идентификатор пользователя, я думаю, вы можете изменить подшаблон на (? P \ d +), который можетзаставь убрать неоднозначность.

...