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 回答