регулярное выражение для соответствия определенному символу, но не обязательно - PullRequest
0 голосов
/ 01 июня 2018

Рассмотрим следующие строки

home
administrator
admin
admin/
admin/users/index

и preg_match("/^admin\/?(P<controller>[a-z-]+)?\/?(?P<action>[a-z-]+)?$/i", $input_line, $output_array);

, которые работают, чтобы соответствовать последним 3 строкам, как ожидается, но также соответствуют 'администратору', возвращающему 'istrator' в качестве«controller»

Как сделать «/» необязательным, но любой другой символ не считается.Я пробовал такие вещи, как [^a-z]\/?, но я в растерянности.Возможно ли это?

логика;1. соответствует admin
2. все следующие символы являются необязательными
2.1, если существует следующий символ, это должен быть /

живой пример https://www.phpliveregex.com/p/oaQ

1 Ответ

0 голосов
/ 01 июня 2018

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

'~^admin(?:\/(?P<controller>[a-z-]+))?(?:\/(?P<action>[a-z-]+))?\/?$~i'

См. Демонстрационную версию regex .

Подробности

  • ^ - начало строки
  • admin - подстрока admin
  • (?:\/(?P<controller>[a-z-]+))? - anнеобязательная группа без захвата, соответствующая 1 или 0 повторениям
    • \/ - / char
    • (?P<controller>[a-z-]+) - группа controller: 1+ букв ASCII или - (Кроме того, рассмотрите возможность использования [^\/]+ вместо того, чтобы сопоставлять любые 1+ символов, отличных от /)
  • (?:\/(?P<action>[a-z-]+))? - Группа action: 1+ ASCII-букв или - (Кроме того, рассмотрите возможность использования [^\/]+ вместо того, чтобы сопоставлять любые 1+ символов кроме /)
  • \/? - необязательный /
  • $ - конец строки.
...