0

私は次のような文字列を持っています

"first,second[,b],third[a,b[1,2,3]],fourth[a[1,2]],sixth"

爆発させて配列にしたい

Array (
    0 => "first",
    1 => "second[,b]",
    2 => "third[a,b[1,2,3]]",
    3 => "fourth[a[1,2]]",
    4 => "sixth"
}

角かっこを削除しようとしました:

preg_replace("/[ ( (?>[^[]]+) | (?R) )* ]/xis", 
             "",
             "first,second[,b],third[a,b[1,2,3]],fourth[a[1,2]],sixth"
); 

しかし、次のステップで行き詰まりました

4

1 に答える 1

4

PHPの正規表現フレーバーは再帰パターンをサポートしているため、次のように機能します。

$text = "first,second[,b],third[a,b[1,2,3]],fourth[a[1,2]],sixth";

preg_match_all('/[^,\[\]]+(\[([^\[\]]|(?1))*])?/', $text, $matches);

print_r($matches[0]);

印刷されます:

配列
((
    [0]=>最初
    [1] =>秒[、b]
    [2] => third [a、b [1,2,3]]
    [3]=>4番目[a[1,2]]
    [4]=>6番目
)。

ここで重要なのはsplit、ではなく、matchです。

このような不可解な正規表現をコードベースに追加するかどうかは、あなた次第です:)

編集

上記の提案は、で始まるエントリと一致しないことに気づきました[。これを行うには、次のようにします。

$text = "first,second[,b],third[a,b[1,2,3]],fourth[a[1,2]],sixth,[s,[,e,[,v,],e,],n]";

preg_match_all("/
    (             # start match group 1
      [^,\[\]]    #   any char other than a comma or square bracket
      |           #   OR
      \[          #   an opening square bracket
      (           #   start match group 2
        [^\[\]]   #     any char other than a square bracket
        |         #     OR
        (?R)      #     recursively match the entire pattern
      )*          #   end match group 2, and repeat it zero or more times
      ]           #   an closing square bracket
    )+            # end match group 1, and repeat it once or more times
    /x", 
    $text, 
    $matches
);

print_r($matches[0]);

印刷するもの:

配列
((
    [0]=>最初
    [1] =>秒[、b]
    [2] => third [a、b [1,2,3]]
    [3]=>4番目[a[1,2]]
    [4]=>6番目
    [5] => [s、[、e、[、v、]、e、]、n]
)。
于 2012-11-12T16:48:54.700 に答える