Javascript 将结构转换为PHP数组
我们公司使用的可怕系统给了我以下输出:Javascript 将结构转换为PHP数组,javascript,php,arrays,json,data-conversion,Javascript,Php,Arrays,Json,Data Conversion,我们公司使用的可怕系统给了我以下输出: { party:"bases", number:"1", id:"xx_3039366", url:"systen01-ny.com", target:"_self", address:"Ch\u00e3o as Alminhas-Medas,Uteiros de Gatos e Fontes Longaq<br/>64320-761 ANHADOS LdA", coordinate:{
{
party:"bases",
number:"1",
id:"xx_3039366",
url:"systen01-ny.com",
target:"_self",
address:"Ch\u00e3o as Alminhas-Medas,Uteiros de Gatos e Fontes Longaq<br/>64320-761 ANHADOS LdA",
coordinate:{
x:90.995262145996094,
y:-1.3394836426
},
contactDetails:{
id:"366",
phone:"xxxxxx",
mobile:"",
fax:"xxxx 777 235",
c2c:!0
},
parameters:"Flex Am\u00e1vel Silva,hal,,EN_30336,S,786657,1,0,",
text:"Vila Nova de Loz C\u00f4a,os melhores vinhos, v\u00e1rias. Produtor/exportador/com\u00e9rcio",
website:null,
mail:"",
listing:"paid",
pCode:"64",
name:"xpto Am\u00e1vel Costa",
logo:{src:"http://ny.test.gif",
altname:"xpto Am\u00e1vel Costa"},
bookingUrl:"",
ipUrl:"",
ipLabel:"",
customerId:"7657",
addressId:"98760",
combined:null,
showReviews:!0
}
{
党:“基地”,
编号:“1”,
id:“xx_3039366”,
网址:“systen01 ny.com”,
目标:“_self”,
地址:“作为阿尔米哈斯·梅达斯,乌泰罗斯·德加托斯·丰特斯·隆格”
64320-761 ANHADOS LdA,
协调:{
x:90.995262145996094,
y:-1.3394836426
},
联系方式:{
id:“366”,
电话:“xxxxxx”,
流动电话:“,
传真:“xxxx 777 235”,
c2c:!0
},
参数:“Flex Am\u00e1vel Silva,hal,,EN_30336,S,786657,1,0,”,
文字:“Vila Nova de Loz C\u00f4a,os melhores vinhos,v\u00e1rias.Produtor/exportador/com\u00e9rcio”,
网站:空,
邮件:“,
清单:“已付”,
pCode:“64”,
名称:“xpto Am\u00e1vel Costa”,
徽标:{src:“http://ny.test.gif",
altname:“xpto Am\u00e1vel Costa”},
bookingUrl:“”,
ipUrl:“”,
ipLabel:“”,
客户ID:“7657”,
地址ID:“98760”,
合并:空,
showReviews:!0
}
我想知道是否有一种方法可以将输出转换为数组,就好像它是一个json,或者甚至是我可以在PHP中处理这些数据的其他格式一样。Json_解码不起作用。就像我说的,这里是您自己的Json对象解析器 一句警告的话,这类事情可能比科学更艺术,所以如果你的输入与你的例子中的不同,它可能会有问题。由于样本量很小(1个文档),我不能保证它的功能超出这一示例 我会试图解释这是如何工作的,但我担心这会让凡人感到困惑 说真的,这很有趣,享受这一次的挑战
<?php
function parseJson($subject, $tokens)
{
$types = array_keys($tokens);
$patterns = [];
$lexer_stream = [];
$result = false;
foreach ($tokens as $k=>$v){
$patterns[] = "(?P<$k>$v)";
}
$pattern = "/".implode('|', $patterns)."/i";
if (preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE)) {
//print_r($matches);
foreach ($matches[0] as $key => $value) {
$match = [];
foreach ($types as $type) {
$match = $matches[$type][$key];
if (is_array($match) && $match[1] != -1) {
break;
}
}
$tok = [
'content' => $match[0],
'type' => $type,
'offset' => $match[1]
];
$lexer_stream[] = $tok;
}
$result = parseJsonTokens( $lexer_stream );
}
return $result;
}
function parseJsonTokens( array &$lexer_stream ){
$result = [];
next($lexer_stream); //advnace one
$mode = 'key'; //items start in key mode ( key => value )
$key = '';
$value = '';
while($current = current($lexer_stream)){
$content = $current['content'];
$type = $current['type'];
switch($type){
case 'T_WHITESPACE'://ignore whitespace
next($lexer_stream);
break;
case 'T_STRING':
//keys are always strings, but strings are not always keys
if( $mode == 'key')
$key .= $content;
else
$value .= $content;
next($lexer_stream); //consume a token
break;
case 'T_COLON':
$mode = 'value'; //change mode key :
next($lexer_stream);//consume a token
break;
case 'T_ENCAP_STRING':
$value .= trim(unicode_decode($content),'"'); //encapsulated strings are always content
next($lexer_stream);//consume a token
break;
case 'T_NULL':
$value = null; //encapsulated strings are always content
next($lexer_stream);//consume a token
break;
case 'T_COMMA': //comma ends an item
//store
$result[$key] = $value;
//reset
$mode = 'key'; //items start in key mode ( key => value )
$key = '';
$value = '';
next($lexer_stream);//consume a token
break;
case 'T_OPEN_BRACE': //start of a sub-block
$value = parseJsonTokens($lexer_stream); //recursive
break;
case 'T_CLOSE_BRACE': //start of a sub-block
//store
$result[$key] = $value;
next($lexer_stream);//consume a token
return $result;
break;
default:
print_r($current);
trigger_error("Unknown token $type value $content", E_USER_ERROR);
}
}
if( !$current ) return;
print_r($current);
trigger_error("Unclosed item $mode for $type value $content", E_USER_ERROR);
}
//@see https://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha
function replace_unicode_escape_sequence($match) {
return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}
function unicode_decode($str) {
return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'replace_unicode_escape_sequence', $str);
}
$str = '{
party:"bases",
number:"1",
id:"xx_3039366",
url:"systen01-ny.com",
target:"_self",
address:"Ch\u00e3o as Alminhas-Medas,Uteiros de Gatos e Fontes Longaq<br/>64320-761 ANHADOS LdA",
coordinate:{
x:90.995262145996094,
y:-1.3394836426
},
contactDetails:{
id:"366",
phone:"xxxxxx",
mobile:"",
fax:"xxxx 777 235",
c2c:!0
},
parameters:"Flex Am\u00e1vel Silva,hal,,EN_30336,S,786657,1,0,",
text:"Vila Nova de Loz C\u00f4a,os melhores vinhos, v\u00e1rias. Produtor/exportador/com\u00e9rcio",
website:null,
mail:"",
listing:"paid",
pCode:"64",
name:"xpto Am\u00e1vel Costa",
logo:{src:"http://ny.test.gif",
altname:"xpto Am\u00e1vel Costa"},
bookingUrl:"",
ipUrl:"",
ipLabel:"",
customerId:"7657",
addressId:"98760",
combined:null,
showReviews:!0
}';
$tokens = [
'T_OPEN_BRACE' => '\{',
'T_CLOSE_BRACE' => '\}',
'T_NULL' => '\bnull\b',
'T_ENCAP_STRING' => '\".*?(?<!\\\\)\"',
'T_COLON' => ':',
'T_COMMA' => ',',
'T_STRING' => '[-a-z0-9_.!]+',
'T_WHITESPACE' => '[\r\n\s\t]+',
'T_UNKNOWN' => '.+?'
];
var_export( parseJson($str, $tokens) );
没错,它不是有效的json,我可以告诉你,这不会是微不足道的。这不是json,而是javascript对象文本。如果您可以在前端对其进行JSON字符串化…如果不能,那么good luckany将提供更多信息?如果您不能依赖客户端处理或PHP解析,您还可以使用Javascript解释器在服务器端执行并返回JSON字符串化。类似Node.JS或使用类似的库<代码>$json=JS:run('var output=json.stringify('.$data.');print(output);')好吧,我撒谎了,也许我会给你写一封信,不过这会花我一些时间,现在也吃晚饭。。。稍后再来看看。你的热情应该得到10票的支持,而真正写出完整的json解析器则应该得到50票。干得好,谢谢你不是典型的,所以我现在一直在做很多关于解析器的工作,所以我有了大部分代码,或者至少是已经解决的困难部分。我正在编写一个HTML模板解析器,用于执行模板并将其编译为PHP代码。除此之外,这很简单,但仍然很有趣。老兄,我真不敢相信你解决了这个问题。我已经开始写这个分析器了,但还需要两天的时间来准备。在这里发帖是我最后的选择,我没想到会有人用如此直接的解决方案来回应。它使用系统提供的所有输出进行测试和工作。救了我一天。只花了2个多小时,我就看着行尸走肉。英雄联盟当然很高兴我能帮忙。
array (
'party' => 'bases',
'number' => '1',
'id' => 'xx_3039366',
'url' => 'systen01-ny.com',
'target' => '_self',
'address' => 'Chão as Alminhas-Medas,Uteiros de Gatos e Fontes Longaq<br/>64320-761 ANHADOS LdA',
'coordinate' =>
array (
'x' => '90.995262145996094',
'y' => '-1.3394836426',
),
'contactDetails' =>
array (
'id' => '366',
'phone' => 'xxxxxx',
'mobile' => '',
'fax' => 'xxxx 777 235',
'c2c' => '!0',
),
'parameters' => 'Flex Amável Silva,hal,,EN_30336,S,786657,1,0,',
'text' => 'Vila Nova de Loz Côa,os melhores vinhos, várias. Produtor/exportador/comércio',
'website' => NULL,
'mail' => '',
'listing' => 'paid',
'pCode' => '64',
'name' => 'xpto Amável Costa',
'logo' =>
array (
'src' => 'http://ny.test.gif',
'altname' => 'xpto Amável Costa',
),
'bookingUrl' => '',
'ipUrl' => '',
'ipLabel' => '',
'customerId' => '7657',
'addressId' => '98760',
'combined' => NULL,
'showReviews' => '!0',
)