Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.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 使用正则表达式将字符串转换为JSON_Php_Json_Regex - Fatal编程技术网

Php 使用正则表达式将字符串转换为JSON

Php 使用正则表达式将字符串转换为JSON,php,json,regex,Php,Json,Regex,我有这样一个字符串: { "XXX" "XXX" "XXX" "XXX" "XXX" { "XXX" "XXX" "XXX" "XXX" "XXX" { "XXX" "XXX" } "XXX" { "XXX" "XXX" "XXX" "XXX" "XXX" "XXX"

我有这样一个字符串:

{
"XXX"       "XXX"
"XXX"       "XXX"
"XXX"
{
    "XXX"       "XXX"
    "XXX"       "XXX"
    "XXX"
    {
        "XXX"       "XXX"
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
    }
    "XXX"       "XXX"
}
"XXX"
{
    "XXX"       "XXX"
    "XXX"
    {
        "XXX"       "XXX"
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
    }
    "XXX"       "XXX"
}
"XXX"
{
    "XXX"       "XXX"
    "XXX"
    {
        "XXX"       "XXX"
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
    }
    "XXX"       "XXX"
}
"XXX"
{
    "XXX"       "XXX"
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
        "XXX"       "XXX"
    }
    "XXX"       "XXX"
}
"XXX"
{
    "XXX"
    {
        "XXX"       "XXX"
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       ""
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       ""
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       ""
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       ""
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       ""
    }
    "XXX"
    {
        "XXX"       "XXX"
        "XXX"       ""
    }
  }
}
它看起来像JSON,但事实并非如此:它缺少所有的逗号(“,”)和冒号(“:”)。我试图找到一种方法来解析它并将其转换为有效的JSON字符串

我的猜测是使用表格和换行符在字符串中找到我的方式,但到目前为止,我无法将其转换为有效的JSON

我想出了这个办法,但我认为它效率不高,也不安全:

$e = explode( "\n", $string );
foreach( $e as $k => $l ) {

$next = str_replace( "\t", '', $e[ $k + 1 ] );
$isParam = strstr( $l, "\"\t\t\"" );
$currentClean = str_replace( "\t", '', $l );

if ( $isParam )
    $e[ $k ] = str_replace( "\"\t\t\"", '":"', $l );

if ( $isParam && $next != '}' )
    $e[ $k ] .= ',';

if ( $currentClean == '}' && $next != '}' && $next )
    $e[ $k ] .= ',';

if ( preg_match( '#^"(.*)"$#', $currentClean ) && !$isParam )
    $e[ $k ] .= ':';

}
$json = implode("\n", $e);

如何改进这一点?

虽然不完全完美,但却是一个非常好的开端:

// Replace '"xxx" "xxx"' by '"xxx": "xxx",'
$string = preg_replace('/("[^"]+")\s+("[^"]*")/','$1: $2,',$string);

// Replace '} "xxx" {' with "} "xxx": {", accept "}" and "{" for start/end
$string = preg_replace('/([{}])(\s+)("[^"]+")\s+([{}])/','$1$2$3:$4',$string);

// Replace ", {" by " {"
$string = preg_replace('/,(\s*[}{])/','$1',$string);

echo $string;
问题:第一个正则表达式在每次匹配后都会放置一个
。值列表中的最后一个值不应如此:

...
"XXX":{
   "XXX": "XXX",
   "XXX": "", <-- Wrong!
}
...
。。。
“XXX”:{
“XXX”:“XXX”,

“XXX”:“,”并非完全完美,但却是一个非常好的开端:

// Replace '"xxx" "xxx"' by '"xxx": "xxx",'
$string = preg_replace('/("[^"]+")\s+("[^"]*")/','$1: $2,',$string);

// Replace '} "xxx" {' with "} "xxx": {", accept "}" and "{" for start/end
$string = preg_replace('/([{}])(\s+)("[^"]+")\s+([{}])/','$1$2$3:$4',$string);

// Replace ", {" by " {"
$string = preg_replace('/,(\s*[}{])/','$1',$string);

echo $string;
问题:第一个正则表达式在每次匹配后都会放置一个
。不应该是值列表中的最后一个值,如下所示:

...
"XXX":{
   "XXX": "XXX",
   "XXX": "", <-- Wrong!
}
...
。。。
“XXX”:{
“XXX”:“XXX”,

“XXX”:“,”问题是您手头有几个替换项……所以我的答案是几个电话(我尝试所有文本,不需要每行分隔,只需输入全文)

PD:我不知道你的价值观是什么,所以我在答案中留下了\w+。如果有帮助,请告诉我


PD2:你可以在

上试试。问题是你手头有几个替代品……所以我的答案有几个电话(我尝试所有文本,不需要每行分开,只需输入全文)

PD:我不知道你的价值观是什么,所以我在答案中留下了\w+。如果有帮助,请告诉我



PD2:你可以在

上试试这个字符串是从哪里来的?@AlexAndrei它来自一个我无法控制的服务。很遗憾,你应该要求提供商将这个垃圾修复成一个有效的格式。如果你开始解析这些东西,情况会变得更糟,提供商永远不会习惯有效的格式。特别是如果你为服务付费的话。似乎您的“json”示例已损坏。24
{
只有23
}
方括号。我刚回来,发现问题被搁置,因此无法发布答案。我注意到,如果我按相反顺序处理文本行,这个问题将更容易解决。我的解决方案使用了四个正则表达式:'\}','(\“*?\”)\s+(\“*”),“^\s*(\“*?\”)(\s*)$”,”^\{'string从何而来?@AlexAndrei它来自一个我无法控制的服务。很遗憾,你应该要求提供商将这个垃圾修复为有效的格式。如果你开始解析这些东西,情况会变得更糟,提供商将永远无法适应有效的格式。特别是如果你为服务付费的话。看起来像是你的“json”示例已损坏。24
{
,只有23
}
方括号。我刚回来,发现问题被搁置,因此无法发布答案。我注意到,如果我按相反顺序处理文本行,这个问题将更容易解决。我的解决方案使用了四个正则表达式:'\}','(\“*?\”)\s+(\“*”,'^\s*(\“*?\”))(\s*)$”,“^\{”的工作原理与预期一样,只是在有“key”:“value”的情况下,它没有添加“:”。代码返回“key”,“value”.Result at:fixed,我完全忘记了键。比您的初始选项快吗?它很可能更快。至少,它更优雅…!我仍然有一个问题,在第108行。试图找出它是什么。结果:我现在注意到,初始输入中缺少一个“}”,有24{,只有23}确实是@maxhb comments。我想是在我粘贴Stackoverflow的编辑器或其他东西时。谢谢。它工作得很好:)工作得和预期的一样,只是在我们有“key”:“value”的情况下它没有添加“:”。您的代码返回“key”,“value”.Result at:fixed,我完全忘记了键。比您的初始选项快吗?它很可能更快。至少,它更优雅…!我仍然有一个问题,在第108行。试图找出它是什么。结果:我现在注意到,初始输入中缺少一个“}”,有24{,只有23}确实是@maxhb comments。我想是在我粘贴Stackoverflow的编辑器或其他东西的时候。谢谢。它工作得很好:)的确是个好的开始。它得到了所有它应该得到的东西,除了那个逗号。我会试着看看我是否能改进你的代码。谢谢!添加了第三个正则表达式,它将处理
;-)OUP,这是我在开始时没有注意到的t:在这种情况下,它不会在“key:{“key”:“value”},“key”:……(“}”后面的逗号)之后加逗号。这确实是一个好的开始。它得到了所有它应该得到的东西,除了那个逗号。我会试试看是否能改进你的代码。谢谢添加了第三个正则表达式,它将处理
;-)一开始我没有注意到:它不会在这种情况下添加逗号:“key”:{“key”:“value”},“key”:。。。。(在“}”后面的逗号)。