WedX - журнал о программировании и компьютерных науках

регулярное выражение, соответствующий URL

В PHP маршрутизация klein будет соответствовать как можно большему количеству маршрутов. 2 настроенных мной маршрута противоречат друг другу. Они есть:

$route1: '/websites/[i:websiteId]/users/[i:id]?'

а также

$route2: '/websites/[i:websiteId]/users/[a:filename].[json|csv:extension]?'

Это URL-адрес, который я пытаюсь сопоставить, который, я думаю, должен соответствовать первому, а не второму:

/api/v1-test/websites/100/users/4

Регулярное выражение, созданное для этих двух:

$regex1: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<id>[0-9]++))?$`

$regex2: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<filename>[0-9A-Za-z]++))(?:\.(?P<extension>json|csv))?$`

Я имею в виду, чтобы он не совпадал, если нет '.csv' или '.json'. Проблема в том, что он соответствует обоим маршрутам. Для второго результирующего имени файла будет «4», а расширение будет пустым.

Отправка /api/v1-test/websites/100/users/users.csv работает правильно и соответствует только второму маршруту.

У меня есть контроль только над маршрутом, а не регулярным выражением или соответствием. Спасибо.

13.04.2013

Ответы:


1

Этот бит здесь

(?:\.(?P<extension>json|csv))?

в конце вашего второго регулярного выражения заставляет его соответствовать, есть ли имя файла из-за ? в самом конце. Знаки вопроса означают 0 or 1 of the previous expression. Избавьтесь от этого, и, по крайней мере, строки будут соответствовать этому регулярному выражению, только если у них есть расширение.

Чтобы внести это изменение, просто удалите вопросительный знак со своего второго маршрута, например:

$route2: '/websites/[i:websiteId]/users/[a:filename].[json|csv:extension]'
13.04.2013
  • Мне не очень понравился этот ответ, когда я впервые его прочитал. Мое наивное понимание - это что? говорит, что все, что после этого, принимается в качестве параметров. 15.04.2013
  • Ты прав что то? можно использовать для обозначения подшаблона. Но бывает, что в синтаксисе регулярных выражений PHP (который использует система маршрутизации Кляйна) вопросительный знак используется по-разному. Последний ? в вашем маршруте интерпретируется как 0 or 1 метасимвол. 15.04.2013
  • Фактически, последний пример маршрута в файле readme Кляйна имеет очень похожий маршрут на то, что вы описали, явно указав, что это приводит к расширению файла параметров. Если вы хотите, чтобы route2 требовал расширения, вам следует удалить завершающий ?. 15.04.2013
  • Извините, моя клавиатура заблокировалась сразу после того, как я написал это, и я не успел закончить свою мысль. Измените его на [json | csv: extension] +? исправляет это. Так что ты прав. 15.04.2013
  • @BradWhite: это работает, если URL-адрес выглядит как /api/v1-test/websites/100/users/test? (и вы хотите, чтобы он разветвлялся в этом случае?) 15.04.2013

  • 2

    Проблема в том, что match_type действительно определен ... как ни странно:

    $match_types = array(
                'i' => '[0-9]++',
                'a' => '[0-9A-Za-z]++',
    [...]
    

    Таким образом, вы не можете захватить последовательность, соответствующую только [a-zA-Z] ... Единственный вариант, который я вижу, - это использовать 3 маршрута:

    $route1: '/websites/[i:websiteId]/users/[i:id]?'
    $route2: '/websites/[i:websiteId]/users/[a:filename]'
    $route3: '/websites/[i:websiteId]/users/[a:filename].[json|csv:extension]'
    

    И назначить те же действия для маршрутов 2 и 3. Тогда у вас будет следующее:

    • /api/v1-test/websites/100/users/ соответствует 1
    • /api/v1-test/websites/100/users/4 соответствует 1
    • /api/v1-test/websites/100/users/test соответствует 2
    • /api/v1-test/websites/100/users/test.csv соответствует 3

    Это похоже на то поведение, которое вы хотели.

    Другое (более простое) решение - воспользоваться этой частью документации:

    Routes automatically match the entire request URI.
    If you need to match only a part of the request URI
    or use a custom regular expression, use the @ operator.

    Затем вы можете определить свои маршруты следующим образом:

    $route1: '@/websites/[0-9]+/users/[0-9]*$'
    $route1: '@/websites/[0-9]+/users/[a-zA-Z]+(\.[a-zA-Z]+)?$'
    
    13.04.2013
  • С философской точки зрения мне больше понравился этот ответ. Я думал, что использование нескольких маршрутов имеет потенциал. Но мне все еще нужен? из-за всех параметров, следующих за ним. Поэтому я не понимаю, как ваше изменение препятствует тому, чтобы пользователь / 4 соответствовал маршруту 3. 15.04.2013
  • Так что я ошибаюсь. PHP понимает? в URL-адресе, не добавляя его в маршрут. 15.04.2013
  • @BradWhite: ну, на самом деле, когда я снова читаю свой ответ, я думаю, что первое решение все-таки не сработает ... user / 4 не будет соответствовать маршруту 3, потому что ему требуется расширение после имени файла. однако я думаю, что user / 4 все равно будет соответствовать маршрутам 1 и 2. Однако я почти уверен, что второе решение - это именно то, что вам нужно. 15.04.2013
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]