Я пытаюсь разделить/взорвать/preg_split строку, но я хочу сохранить разделитель

Я пытаюсь разделить/взорвать/preg_split строку, но я хочу сохранить пример разделителя:

explode('/block/', '/block/2/page/2/block/3/page/4');

Ожидаемый результат :

array('/block/2/page/2', '/block/3/page/4');

Не уверен, нужно ли мне зацикливаться, а затем повторно префиксировать значения массива или есть более чистый способ.

Я пробовал preg_split() с PREG_SPLIT_DELIM_CAPTURE, но получаю что-то вроде:

array('/block/, 2/page/2', '/block/, 3/page/4');

Это не то, чего я хочу. Любая помощь горячо приветствуется.


person Purplefish32    schedule 28.11.2011    source источник
comment
Вы хотите сделать это в одну строку или просто сделать это?   -  person Aurelio De Rosa    schedule 29.11.2011
comment
Я уже прочитал этот вопрос, и я не думаю, что это дубликат   -  person Purplefish32    schedule 29.11.2011


Ответы (2)


Вы можете использовать preg_match_all следующим образом:

$matches = array();
preg_match_all('/(\/block\/[0-9]+\/page\/[0-9]+)/', '/block/2/page/2/block/3/page/4', $matches);
var_dump( $matches[0]);

Выход:

array(2) {
  [0]=>
  string(15) "/block/2/page/2"
  [1]=>
  string(15) "/block/3/page/4"
}

Демо

Изменить: это лучшее, что я мог сделать с preg_split.

$array = preg_split('#(/block/)#', '/block/2/page/2/block/3/page/4', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

$result = array();
for( $i = 0, $count = count( $array); $i < $count; $i += 2)
{
    $result[] = $array[$i] . $array[$i + 1];   
}

Не стоит использовать регулярное выражение, если вам все еще нужно зациклиться, чтобы добавить разделитель. Просто используйте взорваться и добавьте разделитель самостоятельно:

$delimiter = '/block/'; $results = array();
foreach( explode( $delimiter, '/block/2/page/2/block/3/page/4') as $entry)
{
    if( !empty( $entry))
    {
        $results[] = $delimiter . $entry;
    }
}

Демо

Окончательное редактирование: решено! Вот решение с использованием одного регулярного выражения, preg_split и PREG_SPLIT_DELIM_CAPTURE

$regex = '#(/block/(?:\w+/?)+(?=/block/))#';
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
preg_split( $regex, '/block/2/page/2/block/3/page/4', -1, $flags);
preg_split( $regex, '/block/2/page/2/order/title/sort/asc/block/3/page/4', -1, $flags);

Выход:

array(2) {
  [0]=>
  string(15) "/block/2/page/2"
  [1]=>
  string(15) "/block/3/page/4"
}
array(2) {
  [0]=>
  string(36) "/block/2/page/2/order/title/sort/asc"
  [1]=>
  string(15) "/block/3/page/4"
}

Финальная демонстрация

person nickb    schedule 28.11.2011
comment
Спасибо за ответ, проблема в моем случае в том, что я заранее не знаю, сколько сегментов существует, например: 3/стр./4'); ожидаемый результат: array('/block/2/page/2/order/title/sort/asc', '/block/3/page/4'); - person Purplefish32; 29.11.2011
comment
@ Purplefish32 - я добавил более подробный ответ. К сожалению, я не смог добиться желаемых результатов с помощью одного регулярного выражения и вернулся к добавлению разделителя. - person nickb; 29.11.2011
comment
Отлично, я наконец-то выбрал метод предварительного разделителя, работает как шарм, спасибо всем, кто ответил - person Purplefish32; 30.11.2011
comment
@Purplefish32 - Мое последнее редактирование - идеальное решение, использующее одно регулярное выражение и preg_split для точного достижения желаемых результатов. Надеюсь, это поможет, пожалуйста, дайте мне знать! :) - person nickb; 30.11.2011

Имейте в виду, что:

explode('/block/', '/block/2/page/2/block/3/page/4');

Приведет к:

array("", "2/page/2", "3/page/4");

Вы можете использовать preg_match_all как

preg_match_all(":(/block/.*?):", $string); // untested

Но простое добавление разделителя является гораздо более ясным решением.

person Halcyon    schedule 28.11.2011
comment
Спасибо за совет, как мне добавить разделитель? - person Purplefish32; 29.11.2011