Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式解析[]之间的数据_Php_Json_Regex - Fatal编程技术网

PHP正则表达式解析[]之间的数据

PHP正则表达式解析[]之间的数据,php,json,regex,Php,Json,Regex,我有一个字符串,我想转换成一个有效的JSON,然后JSON_解码它。 以下是字符串的外观: [ ['test', 'lol'], ['test2', 'lol2'] ] [ ['test32', 'loDl'], ['test32', 'loDl2'] ] [ ['tes23t', 'loDEl'], ['testDE2', 'lolDE2'] ] 我只想得到每个人之间的数据 [ ] 因此,结果可能是: ['test', 'lol'], ['

我有一个字符串,我想转换成一个有效的JSON,然后JSON_解码它。 以下是字符串的外观:

[
    ['test', 'lol'],
    ['test2', 'lol2']
]
[
    ['test32', 'loDl'],
    ['test32', 'loDl2']
]
[
    ['tes23t', 'loDEl'],
    ['testDE2', 'lolDE2']
]
我只想得到每个人之间的数据

[

]
因此,结果可能是:

['test', 'lol'],
['test2', 'lol2'],
['test32', 'loDl'],
['test32', 'loDl2'],
['tes23t', 'loDEl'],
['testDE2', 'lolDE2']
因此,我认为我需要使用
regex
preg_split
,以下是我所做的:

$jsons = preg_split('/\]\s*(?=\[)/', $data, null);
$jsond = "";
foreach ($jsons as $json) {
     $json .= "";
     $jsond .= $json;
} 
return $jsond;
但它不起作用,我仍然无法在每个
[]

我该怎么做?
提前谢谢

PS:这是真正的完整字符串
这也是一种可能的解决方案:

$data = preg_replace('/\s+/', '', $data);
$data = str_replace("[[", "[", $data);
$jsons = str_replace("]]", "]", $data);
echo$jsons

['test','lol'],['test2','lol2']['test32','loDl'],['test32','loDl2']['tes23t','loDEl'],['testDE2','lolDE2']

这也是可能的解决方案:

$data = preg_replace('/\s+/', '', $data);
$data = str_replace("[[", "[", $data);
$jsons = str_replace("]]", "]", $data);
echo$jsons

['test','lol'],['test2','lol2']['test32','loDl'],['test32','loDl2']['tes23t','loDEl'],['testDE2','lolDE2']
这是你想要的吗

这就是您想要的吗?

您在每一行上都有有效JSON的字符串。但是,所有行一起并不代表一个有效的JSON

我建议以最小的方式操纵数据,使整个文本用一个简单的正则表达式表示为JSON。如果原始数据为$data,则按如下方式创建JSON:

$json=preg\u replace('/(\])\](\R)\[/'、'$1、$2'、$data);
这将删除一行末尾的结束括号和下一行开头的开始括号。而是插入逗号。结果将是有效的JSON,因为开始处的开始括号现在与最后一个结束括号匹配

我从您的数据中选取了一些具有代表性的文本:

$data='[“s”,“13”,“Shelfs_norja”,“49500”,“0”,“1”,“1”,“ffffff”,“F7EBBC”,“米色书柜”,“用于nic NAK和书籍”,“5”,“true”,“1”,“false”,“1”,“true”,“0”,“0”,“false”],[“s”,“117”,“塑料圆桌*9”,“45508”,“0”,“2”,“2”,“FFFF”,“533e10”,“圆桌”,“塑料家具”,“1”,“false”,“1”,“1”,“false”,“1”,“0”,“0”,“false”]]
[“s”、“118”、“plasto_square*9”、“45508”、“0”、“1”、“1”、“45508”、“0”、“119”、“plasto#9”、“45508”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“假”、“假”、“1”、“假”、“0”、“0”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“0”、“0”、“0”、“0”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“,“0”、“假”]、[“s”、“120”、“地毯标准*6”、“48082”、“0”、“3”、“5”、“777777”、“地板地毯”、“有多种颜色可供选择”、“105”、“真”、“-1”、“假”、“1”、“真”、“1”、“1”、“1”、“1”、“1”、“1”、“0”、“假”]、[“s”、“121”、“椅子整形*1”、“45508”、“0”、“1”、“1”、“1”、“ffffff”、“8EB5D1”、“FFFF”、“8EB5E”、“塑料椅子”、“1”、“假家具”、“1”、“1”、“假吊舱”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”等假“、”0“、”1“、”0“、”假“]]”;
它只有两行,以稍微限制数据。现在,上面的代码生成了这个结果,非常漂亮:

[
    [
        "s",
        "13",
        "shelves_norja",
        "49500",
        "0",
        "1",
        "1",
        "#ffffff,#F7EBBC",
        "Beige Bookcase",
        "For nic naks and books.",
        "",
        "5",
        "true",
        "-1",
        "false",
        "",
        "1",
        "true",
        "0",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "117",
        "table_plasto_round*9",
        "45508",
        "0",
        "2",
        "2",
        "#ffffff,#533e10",
        "Round Dining Table",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "118",
        "table_plasto_square*9",
        "45508",
        "0",
        "1",
        "1",
        "#ffffff,#533e10",
        "Occasional Table",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "119",
        "chair_plasto*9",
        "45508",
        "0",
        "1",
        "1",
        "#ffffff,#533e10,#ffffff,#533e10",
        "Chair",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "1",
        "0",
        "false"
    ],
    [
        "s",
        "120",
        "carpet_standard*6",
        "48082",
        "0",
        "3",
        "5",
        "#777777",
        "Floor Rug",
        "Available in a variety of colors",
        "",
        "105",
        "true",
        "-1",
        "false",
        "",
        "1",
        "true",
        "1",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "121",
        "chair_plasty*1",
        "45508",
        "0",
        "1",
        "1",
        "#ffffff,#8EB5D1,#ffffff,#8EB5D1",
        "Plastic Pod Chair",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "1",
        "0",
        "false"
    ]
]
您在每一行上都有有效JSON的字符串。但是,所有行加在一起并不代表一个有效的JSON

我建议以最小的方式操作数据,使整个文本JSON具有一个简单的正则表达式。如果原始数据为$data,则按如下方式创建JSON:

$json=preg\u replace('/(\])\](\R)\[/'、'$1、$2'、$data);
这将删除一行末尾的结束括号和下一行开头的开始括号。而是插入逗号。结果将是有效的JSON,因为开始处的开始括号现在与最后一个结束括号匹配

我从您的数据中选取了一些具有代表性的文本:

$data='[“s”,“13”,“Shelfs_norja”,“49500”,“0”,“1”,“1”,“ffffff”,“F7EBBC”,“米色书柜”,“用于nic NAK和书籍”,“5”,“true”,“1”,“false”,“1”,“true”,“0”,“0”,“false”],[“s”,“117”,“塑料圆桌*9”,“45508”,“0”,“2”,“2”,“FFFF”,“533e10”,“圆桌”,“塑料家具”,“1”,“false”,“1”,“false”,“1”,“1”,“false”“,“0”,“0”,“false”]]
[“s”、“118”、“plasto_square*9”、“45508”、“0”、“1”、“1”、“45508”、“0”、“119”、“plasto#9”、“45508”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“假”、“假”、“1”、“假”、“0”、“0”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“0”、“0”、“0”、“0”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“0”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“,“0”、“假”]、[“s”、“120”、“地毯标准*6”、“48082”、“0”、“3”、“5”、“777777”、“地板地毯”、“有多种颜色可供选择”、“105”、“真”、“-1”、“假”、“1”、“真”、“1”、“1”、“1”、“1”、“1”、“1”、“0”、“假”]、[“s”、“121”、“椅子整形*1”、“45508”、“0”、“1”、“1”、“1”、“ffffff”、“8EB5D1”、“FFFF”、“8EB5E”、“塑料椅子”、“1”、“假家具”、“1”、“1”、“假吊舱”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”等假“、”0“、”1“、”0“、”假“]]”;
它只有两行,以稍微限制数据。现在,上面的代码生成了这个结果,非常漂亮:

[
    [
        "s",
        "13",
        "shelves_norja",
        "49500",
        "0",
        "1",
        "1",
        "#ffffff,#F7EBBC",
        "Beige Bookcase",
        "For nic naks and books.",
        "",
        "5",
        "true",
        "-1",
        "false",
        "",
        "1",
        "true",
        "0",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "117",
        "table_plasto_round*9",
        "45508",
        "0",
        "2",
        "2",
        "#ffffff,#533e10",
        "Round Dining Table",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "118",
        "table_plasto_square*9",
        "45508",
        "0",
        "1",
        "1",
        "#ffffff,#533e10",
        "Occasional Table",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "119",
        "chair_plasto*9",
        "45508",
        "0",
        "1",
        "1",
        "#ffffff,#533e10,#ffffff,#533e10",
        "Chair",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "1",
        "0",
        "false"
    ],
    [
        "s",
        "120",
        "carpet_standard*6",
        "48082",
        "0",
        "3",
        "5",
        "#777777",
        "Floor Rug",
        "Available in a variety of colors",
        "",
        "105",
        "true",
        "-1",
        "false",
        "",
        "1",
        "true",
        "1",
        "0",
        "0",
        "false"
    ],
    [
        "s",
        "121",
        "chair_plasty*1",
        "45508",
        "0",
        "1",
        "1",
        "#ffffff,#8EB5D1,#ffffff,#8EB5D1",
        "Plastic Pod Chair",
        "Hip plastic furniture",
        "",
        "-1",
        "false",
        "-1",
        "false",
        "",
        "1",
        "false",
        "0",
        "1",
        "0",
        "false"
    ]
]

如果您有大量数据并且必须保留内存,则可以使用以下方法:

function genArrayFromFHandler($fh) {
    $state = 0; // (1: main brackets, 2: nested brackets, 3: quotes)
    while(!feof($fh)) {
        $c = fgetc($fh);

        switch($c):
            case '[':
                if ($state) $array = [];
                $state++;
                break;

            case ']':
                if ($state == 2) yield $array;
                $state--;
                break;

            case '"':
                if ($state == 2) {
                    $state++;
                    $item = '';
                } else {
                    $state--;
                    $array[] = $item;
                }
                break;

            default:
                if ($state == 3) $item .= $c;                

        endswitch;
    }
}

try {
    $fh = fopen('yourfile.txt', 'r');// or die ('error opening file');
    if (!$fh) throw new Exception('File open failed.');

    foreach (genArrayFromFHandler($fh) as $arr) {
        // do all what you need with the array here
        print_r($arr);
    }

    fclose($fh);

} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
这不是一种快速的方法,但是内存占用非常少,因为文件从未在内存中完全加载


注意:我不知道您想对数据做什么,如果将它们转换为JSON是一个好主意(JSON对于在应用程序之间共享数据很有用,但如果您想要一些可以轻松高效地查询的数据,最好使用数据库。)

如果您有大量数据并且必须保留内存,您可以使用以下方法:

function genArrayFromFHandler($fh) {
    $state = 0; // (1: main brackets, 2: nested brackets, 3: quotes)
    while(!feof($fh)) {
        $c = fgetc($fh);

        switch($c):
            case '[':
                if ($state) $array = [];
                $state++;
                break;

            case ']':
                if ($state == 2) yield $array;
                $state--;
                break;

            case '"':
                if ($state == 2) {
                    $state++;
                    $item = '';
                } else {
                    $state--;
                    $array[] = $item;
                }
                break;

            default:
                if ($state == 3) $item .= $c;                

        endswitch;
    }
}

try {
    $fh = fopen('yourfile.txt', 'r');// or die ('error opening file');
    if (!$fh) throw new Exception('File open failed.');

    foreach (genArrayFromFHandler($fh) as $arr) {
        // do all what you need with the array here
        print_r($arr);
    }

    fclose($fh);

} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
这不是一种快速的方法,但是内存占用非常少,因为文件从未在内存中完全加载


注意:我不知道您想对数据做什么,也不知道将数据转换为JSON是否是一个好主意(JSON对于在应用程序之间共享数据很有用,但如果您想要能够轻松高效地查询的数据,最好使用数据库。)

不,不起作用,我只得到了很多\n因为您似乎有很多来自大型文件的数据,我建议不要对整个内容使用全局正则表达式,而是使用流。那么,为什么不试试正则表达式,抓取
$matches[1]
然后对它们做任何你想做的事?虽然你指向的链接是有效的JSON,但你在问题中给出的示例不是。JSON用双引号而不是单引号来包装文本。@trincot当我尝试验证我在链接中指向的JSON时,它使用