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

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

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

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

preg_match('%app/(\d+)/(\d+)/(\.*)$%', $text, $matches)

0

Решение

Я бы сделал:

$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] =>
)
1

Другие решения

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

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

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

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

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

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

и вуаля.

1

По вопросам рекламы [email protected]