PHP regex preg_match_all:在多个方括号之间捕获文本

时间:2013-05-01 12:11:09

标签: php regex preg-match-all

我需要捕获一些字符串数组..我一直在尝试,但我不能:$

我的代码中有这个:

<?php
$feed = "[['2013/04/03',8.300],['2013/04/04',8.320],['2013/04/05',8.400]]";
preg_match_all("/\[(.*?)\]/",$feed,$matches);
print_r($matches);

并且正在返回:

Array
(
    [0] => Array
        (
            [0] => [['2013/04/03',8.300]
            [1] => ['2013/04/04',8.320]
            [2] => ['2013/04/05',8.400]
        )

    [1] => Array
        (
            [0] => ['2013/04/03',8.300
            [1] => '2013/04/04',8.320
            [2] => '2013/04/05',8.400
        )

)

如何使用preg_match_all或preg_split ..或者返回一个元素数组所需的任何方法,如$ matches [1] [1]或$ matches [1] [2] ??

我的意思是每个元素的格式应该是:

'2013/04/05',8.400

希望明确:)

并提前致谢!!

3 个答案:

答案 0 :(得分:1)

此文本似乎采用相当规范化的格式,ala JSON。完全可以避免reg匹配并用 json_decode 解析它,尽管必须进行一些小的转换。

// original input
$text = "[['2013/04/03',8.300],['2013/04/04',8.320],['2013/04/05',8.400]]";

// standard transformation to correct ' and / characters
$text = str_replace( array('/', "'"), array('\/', '"'), $text );

// let native PHP take care of understanding the data
$data = json_decode( $text );

这将为您提供包含日期和值的数组数组。 print_r( $data );给出:

Array (
    [0] => Array (
        [0] => 2013/04/03
        [1] => 8.3
    )
    [1] => Array (
        [0] => 2013/04/04
        [1] => 8.32
    )
    [2] => Array (
        [0] => 2013/04/05
        [1] => 8.4
    )
)

转换正在将/替换为\/,将'替换为",以使字符串符合JSON标准。或者那种效果。

答案 1 :(得分:0)

你可以试试这个:

<?php
$feed = "[['2013/04/03',8.300],['2013/04/04',8.320],['2013/04/05',8.400]]";
preg_match_all('~\[\K[^[\]]++~', $feed, $matches);
print_r($matches);

答案 2 :(得分:0)

如果碰巧是一个有效的json,你可以用字符串进行简单的操作。

$arr = explode("],[", trim($str, " []"));

输出将是一个包含与此类似的元素的数组:"'2013/04/03',8.300" , "'2013/04/04',8.320"

这比使用RegExp方法更快