2014-11-15 3 views
0

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

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

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

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

ответ

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

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

et voilà.