preg_match возвращает все части в массиве - PullRequest
1 голос
/ 04 ноября 2010

У меня следующий php-код:

$match = array();
if (preg_match("%^(/\d+)(/test)(/\w+)*$%", "/25/test/t1/t2/t3/t4", $match))
    print_r($match);

Я получаю такой результат:

Array ( [0] => /25/test/t1/t2/t3/t4 [1] => /25 [2] => /test [3] => /t4 ) 

Что мне нужно изменить в моем регулярном выражении, чтобы получить этот результат:

Array ( [0] => /25/test/t1/t2/t3/t4 [1] => /25 [2] => /test [3] => /t1 [4] => /t2 [5] => /t3  [6] => /t4)

Ответы [ 3 ]

0 голосов
/ 04 ноября 2010
<?php

    $str = '/a/b/1/2/3/4';
    if(preg_match('/^(\/\w+)*$/', $str) && preg_match_all('/\/\w+/', $str, $matches)) {
        $matches = $matches[0];
        print_r($matches);
    }

?>

Печать:

Array
(
    [0] => /a
    [1] => /b
    [2] => /1
    [3] => /2
    [4] => /3
    [5] => /4
)
0 голосов
/ 04 ноября 2010

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

"%(/\w+)(?>[^(/\w+)]?|(?R))%"

Это работает мои подходящие (/ \ w +) подвыражения в свою очередь. Перед матчем за

"/a/b/1/2/3/4"

Будет:

Array
(
[0] => Array
    (
        [0] => /a [1] => /b [2] => /1 [3] => /2 [4] => /3 [5] => /4
    )
...

Однако ваши последующие примеры усложняют ситуацию. Простое совпадение 0 или более вернет только последнее (жадное) или первое (не жадное) совпадение - не все подспаривания. preg_match_all не сможет обработать ваше динамическое выражение.

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

0 голосов
/ 04 ноября 2010

вам нужен preg_match_all

preg_match_all( '~(/\w+)~', $str, $matches );

в вашей ситуации вы можете использовать также взорваться

...