0

私はPHPの初心者で、preg_math_allを使用して文字列を分割しようとしています。

私の文字列は次のようになります:

[0, 5, 2, 1, true, COMMENT, 1][0, 27, 4, 1, true, COMMENT 2, 2]

文字列には、[...]を含む複数の部分が含まれる場合があります。

だから、私は次のようにpreg_match_allを使おうとします:

preg_match_all('/\[\s*?(\d+), \s*?(\d+), \s*?(\d+), \s*?(\d+), \s*?(true|false), (\w+), \s*?(\d+)\]/i', $string, $matches, PREG_SET_ORDER);

しかし、結果は私の希望とは一致しません。それを解決するのを手伝っていただけませんか。

ありがとう

4

2 に答える 2

2

私はこのようなものを使用します:

$string = '[0, 5, 2, 1, true, COMMENT, 1][0, 27, 4, 1, true, COMMENT 2, 2]';
preg_match_all( '#\[([^\]]+)\]#', $string, $matches);

$result = array();
foreach( $matches[1] as $match) {
    $result[] = array_map( 'trim', explode( ',', $match));
}

var_dump( $result);

すべてのコンポーネントを個別に照合するのではなく、角かっこ内のすべてを照合してから、追加の解析を実行して、すべてを独自の配列要素に入れます。

出力:

array(2) {
  [0]=>
  array(7) {
    [0]=>
    string(1) "0"
    [1]=>
    string(1) "5"
    [2]=>
    string(1) "2"
    [3]=>
    string(1) "1"
    [4]=>
    string(4) "true"
    [5]=>
    string(7) "COMMENT"
    [6]=>
    string(1) "1"
  }
  [1]=>
  array(7) {
    [0]=>
    string(1) "0"
    [1]=>
    string(2) "27"
    [2]=>
    string(1) "4"
    [3]=>
    string(1) "1"
    [4]=>
    string(4) "true"
    [5]=>
    string(9) "COMMENT 2"
    [6]=>
    string(1) "2"
  }
}

デモ

または、次のように、使用explodeしてさらに処理を行うこともできます。

$pieces = explode( ']', $string); 
array_pop( $pieces); // There is one extra empty element at the end

$result = array();
foreach( $pieces as $piece) {
    $parts = explode( ',', $piece);
    $parts[0] = trim( $parts[0], '[');
    $result[] = array_map( 'trim', $parts);
}

これにより、上記と同じ出力が得られます。

于 2012-06-20T12:31:25.313 に答える
0

最初に正規表現を使用してブロックに分割する必要があります。

preg_match_all('/\[(.*?)\]/i', $string, $matches);

そして、explode()を使用して各ブロックを分割します:

$values = array();
foreach ($matches[1] as $block) {
    $values[] = explode(',', $block);
}
于 2012-06-20T12:31:26.673 に答える