4

文字列を分割/分解/preg_splitしようとしていますが、区切り文字の例を保持したい:

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

期待される結果 :

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

ループしてから配列値のプレフィックスを付け直す必要があるかどうか、またはよりクリーンな方法があるかどうかはわかりません。

PREG_SPLIT_DELIM_CAPTURE で preg_split() を試しましたが、次のような結果が得られました。

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

これは私が望むものではありません。どんな助けでも大歓迎です。

4

2 に答える 2

7

次のように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;
    }
}

デモ

最終編集:解決しました!1 つの正規表現を使用したソリューションを次に示しますpreg_splitPREG_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"
}

最終デモ

于 2011-11-28T23:27:31.327 に答える
1

それを念頭に置いて:

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

しかし、区切り文字を先頭に追加するだけで、より明確な解決策になります。

于 2011-11-28T23:26:46.133 に答える