PHP preg_match с необязательными математическими правилами

0

Я хочу проанализировать эту строку и получить строку специальных значений для разбора одного из этих шаблонов

app/(integer)/(integer)/(text or null)
app/(integer)/(text or null)
app/(text or null)

Я могу использовать preg_match для простого использования, но я не могу писать необязательные параметры

preg_match('%app/(\d+)/(\d+)/(\.*)$%', $text, $matches)
Теги:
preg-match
optional
optional-parameters

2 ответа

1
Лучший ответ

Я сделаю:

$urls = array(
    'app/12/34/text',
    'app/12/34/',
    'app/56/text',
    'app/56/',
    'app/text',
    'app/',
);
foreach ($urls as $url) {
    preg_match( "#app/(?:(\d+)/)?(?:(\d+)/)?(.*)#", $url, $m);
    print_r($m);
}

Вывод:

Array
(
    [0] => app/12/34/text
    [1] => 12
    [2] => 34
    [3] => text
)
Array
(
    [0] => app/12/34/
    [1] => 12
    [2] => 34
    [3] =>
)
Array
(
    [0] => app/56/text
    [1] => 56
    [2] =>
    [3] => text
)
Array
(
    [0] => app/56/
    [1] => 56
    [2] =>
    [3] =>
)
Array
(
    [0] => app/text
    [1] =>
    [2] =>
    [3] => text
)
Array
(
    [0] => app/
    [1] =>
    [2] =>
    [3] =>
)
  • 0
    спасибо, это самый короткий и лучший способ определить шаблон регулярных выражений.
1

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

app/1/2/foo
app/1/2/
app/1/bar
app/1/
app/bar
app/

Это может быть достигнуто с помощью регулярного выражения с оператором OR (|). Синтаксис будет выглядеть следующим образом:

~app/(\d+)/(\d+)/(\w+)|app/(\d+)/(\d+)/|app/(\d+)/(\w+)|app/(\d+)/|app/(\w+)|app/$~

Я построил regex101 "скрипку" для вашего дела: http://regex101.com/r/zT9jT6/1

Обратите внимание, что "app/" будет соответствовать совпадению с 0 записями в вашем массиве $ matches.

и вуаля.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню