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