在PHP中使用正则表达式修复无效的JSON字符串

时间:2017-07-27 10:53:06

标签: php json regex

以下是以无效格式存储在数据库列中的json字符串。

{"id_content": "1"name": "Zappos Case Page 1"id_content_type": "1}


  $variable = '{"id_content": "1"name": "Zappos Case Page 1"id_content_type": "1}';

所以我想编码&在php中解码它,那么正则表达式是什么,我可以将无效的json转换为有效并正确解析它?

提前感谢。

2 个答案:

答案 0 :(得分:2)

很容易想象您的JSON编码中的错误,分析示例提供的行。有一种模式,所以它可以很容易地恢复。

REGEX方法

你可以使用2阶段正则表达式来修复你的字符串,第一部分是引入缺失的双引号,第二部分是注入昏迷分隔符。

<?php
$str = '{"id_content": "1"name": "Zappos Case Page 1"id_content_type": "1}';
$str = preg_replace( '/"\w+":\s"[\w\s]*/' , '$0"' , $str);
$str = preg_replace( '/""/' , '","' , $str);
echo $str;
?>

STRING MANIPULATION方法

另一种方法是解构,拆分字符串,处理部件,再次构建对象:

<?php
$str = '{"id_content": "1"name": "Zappos Case Page 1"id_content_type": "1}';

// remove '{' from the beggining of the string
$str = ltrim($str, '{');
// remove '}' from the end of the string
$str = rtrim($str, '}');
// remove the first '"' from the beggining of the string
$str = ltrim($str, '"');
// split the string in each '"'
$raw = explode('"' , $str);
// prepare an empty array to store valid properties&values
// and store in it the valid keys (removing useless keys ":")
$clean = array();
for ($i = 0; $i < count($raw); $i++) {
  if ( trim( $raw[$i] ) !== ":") array_push( $clean,$raw[$i] );
}
// asumming property names are on odd keys 
// and values in even keys
// we can now create a valid object...
$obj = array();
for ($i = 0; $i < count($clean); $i++) {
  if ( $i % 2 === 0) $obj[ $clean[$i] ] = $clean[$i+1];
}
// and convert it back to JSON notation
$jsonObj = json_encode($obj);
echo $jsonObj;
?>

INPUT(无效的json):

&#39; {&#34; id_content&#34;:&#34; 1&#34; name&#34;:&#34; Zappos Case Page 1&#34; id_content_type&#34;:&#34; 1}&#39;

OUTPUT(有效的json):

&#39; {&#34;的 id_content &#34;:&#34; 1&#34;&#34;的名称&#34; :&#34; Zappos案例第1页&#34;,&#34; id_content_type &#34;:&#34; 1&#34;}&#39;

此代码仅在模式始终相同时才有效。否则,您将不得不将代码添加到不同的方案中。

答案 1 :(得分:1)

您可以通过类似的方式验证JS本身的json。

function isJSON(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

如果有效则发送到服务器端并保存到DB中。

对于现有数据,您无法执行任何操作。在保存到数据库之前,您可能需要使用任何在线工具(http://json.parser.online.fr/)手动进行更正。