За последние 24 часа нас посетили 20699 программистов и 1651 робот. Сейчас ищут 1968 программистов ...

Как сделать параметр необязательным?

Тема в разделе "Регулярные выражения", создана пользователем Вероломство, 4 авг 2023.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    PHP:
    1. $application->post('/({id:\d+})?', HomeHandler::class);
    2. $application->post('/?{id:\d+}?', HomeHandler::class);
    3. $application->post('/{id:\d+}?', HomeHandler::class);
    Все три работают, какой правильный?

    p.s. помню, что ? делает необязательным группу, но все варианты работают
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    ? - это про жадность.
    + - один и более
    * - ноль и более
     
    Вероломство нравится это.
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @Sail мне нужно сделать параметр необязательным, чтобы работало и / и /123
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    https://regex101.com/r/dqN10b/1
     
    Вероломство нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Это ж не обычная регулярка. В обычной именованные подмаски задаются при помощи ?P<name> (и т.п., например P сейчас не обязательно писать). Сама подмаска (любая) пишется в круглых скобках.

    ? – это не про жадность, а про наличие, как писал ТС, т.е. «0 или 1» элемент/символ. Про жадность, точнее про нежадность, – это +?, *? и ?? ;)
     
    Вероломство нравится это.
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Пример (необязательное нат. число из 1-10 цифр в пути):
    Код (Text):
    1. #^/([1-9]\\d{0,9})?$#
     
    Вероломство нравится это.
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Да, ? - это не только про жадность. Но в контексте данной ветки - про жадность.
    Необязательность обеспечивается другими квантификаторами.
    Либо *...
    Либо {m,n}. Но этот вариант обязателен только в случае если есть количественные ограничения.
    :)
     
    Вероломство нравится это.
  8. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Ещё, конечно, ? как квантификатор применяется, 0 или 1 символ.
    Но, опять-таки - не в контексте данной ветки с id, не ограниченным 9-ю цифрами :)
     
    Вероломство нравится это.
  9. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    вот я от обычной и хотел избавиться, в матчере у меня сейчас

    PHP:
    1. $pattern = preg_replace('~{([a-z]+):([^}]+)}~', '(?P<$1>$2)', $route->getPattern());
    есть вариант в роуте сделать параметр необязательным?

    или оставить как было РАНЬШЕ

    PHP:
    1. $application->post('/(?P<id>\d+)?', HomeHandler::class)->addMiddleware(RedirectToAuth::class);
    и не конвертировать ничего?


    не хочу делать так

    PHP:
    1. $application->post('home', '/{id}', HomeHandler::class, [
    2.     'id' => '\d+'
    3. ])->addMiddleware(RedirectToAuth::class);
    пока что...
     
    #9 Вероломство, 5 авг 2023
    Последнее редактирование: 5 авг 2023
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Разведи / и /<id> между двумя роутами и не парься. Обычно даже на более глубоком уровне разводят.
    --- Добавлено ---
    Хотя в наших движках часто бывает и по два режима, когда роутер не различает /cat и /cat/obj при вызове контроллера/экшина :)
    --- Добавлено ---
    Фишка в том, что в /cat тоже есть obj, но пустой (пустая строка).
     
    Вероломство нравится это.