需要帮助才能找到preg_match_all模式

时间:2012-06-20 12:25:22

标签: php regex

我是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);

但结果却不同意我的希望,你能不能帮我解决这个问题。

由于

2 个答案:

答案 0 :(得分: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"
  }
}

Demo

或者,你可以使用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);
}

这将产生与上面相同的输出。

答案 1 :(得分:0)

首先使用正则表达式将其拆分为块:

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

然后使用explode()分割每个块:

$values = array();
foreach ($matches[1] as $block) {
    $values[] = explode(',', $block);
}