代码之家  ›  专栏  ›  技术社区  ›  user6631314

php/mysql/json:解析复杂字符串或重新组合为字典

  •  -1
  • user6631314  · 技术社区  · 6 年前

    我通过JSON收到一个复杂的字符串,它表示一个对象:

        <Offers: 0x170483070> (entity: Offers; id: 0xd00000000b880006 <x-
    coredata://03C4A684-2218-489C-9EF6-42634ED10552/Offers/p738> ; data: {\\n    
    topic = nil;\\n    topid = 9403;\\n    hasserverid = nil;\\n    isprivate = nil;\\n 
       lasttouched = \\\"2018-07-08 16:49:01 +0000\\\";\\n    lastviewed = nil;\\n
        localid = 42;\\n    needpicsync = nil;\\n    needsync = nil;\\n    secondorder
     = 0;\\n    oid = 0;\\n    offer = test;\\n    offerdone = nil;\\n    offernumber =
     70;\\n    userid = 1;\\n    wasdeleted = nil;\\n    whenadded = \\\"2018-07-08
     16:04:20 +0000\\\”;\\n})
    

    我想把某些东西保存到MySQL中。在上面的示例中,我希望将字段offer和offerNumber等保存到一个记录中,其中包括:

    $sql = "INSERT into offers (offer,offernumber) VALUES ('test',70)";
    

    当然,要做到这一点,我首先必须解析字符串以获取offer的值、offer number的值,理想情况下还要获取整个对象的键和值。

    我应该首先将字符串转换成某种数组、字典或数据结构吗?还是应该尝试使用regex或其他方法解析字符串?如果是后者,会对使用什么regex或技术提出建议。

    提前感谢您的建议!

    1 回复  |  直到 6 年前
        1
  •  1
  •   BDebroy    6 年前

    $input = "**The input string**";
    
    // Remove the escaped new lines
    $jsonString = str_replace("\\n", "\n", substr($input, strpos($input, "data: ")+5));
    $jsonString = substr($jsonString, 0, strlen($jsonString) - 1);
    
    // Convert the equals, semicolons and remove the escaped backslash
    $jsonString = str_replace(";", ",", $jsonString);
    $jsonString = str_replace("=", ":", $jsonString);
    $jsonString = str_replace('\\', '', $jsonString);
    
    $matches = array();
    
    // Use regex to get json key-value
    if(preg_match_all('/(\w+)\s*\:\s*(.+)\s*\,/m', $jsonString, $matches,PREG_SET_ORDER, 0)){
        // Iterate the matches and enclose key and value into double quotes
        foreach($matches as $item){
         // Enclose the value if isn't a number or a date
            if(strpos(trim($item[2]), '"') !== 0 && !is_numeric($item[2])){
                $item[2] = '"'.$item[2].'"';
            }
            // Replace in json string
            $jsonString = str_replace($item[0], '"'.$item[1].'"'.' : '.$item[2].',', $jsonString);
        }
    }
    
    // Remove last comma
    $jsonString = substr($jsonString, 0, strlen($jsonString) - 3) . '}';
    
    // Transform json string to object
    $jsonObject = json_decode($jsonString);
    
    // Show the json string
    echo($jsonString);
    
    // Display the object
    var_dump($jsonObject);
    

    PHP Sandbox