PHP JSON字符串转义里面的双引号值?

苏拉兹

我从这样的api获取JSON字符串:

{ "title":"Example string's with "special" characters" }

使用json_decode无法将其解码为json(其输出为null)。

所以我想将其更改为json可解码的内容,例如:

{ "title":"Example string's with \"special\" characters" }

或者

{ "title":"Example string's with 'special' characters" }

为了使json_decode函数正常工作,我该怎么办?

马特马维

从昨天开始,我一直在尝试解决这个棘手的问题,在拉了很多头发之后,我想到了这个解决方案。

首先,让我们澄清一下我们的假设。

  • json字符串应采用正确的格式。
  • 键和值用双引号引起来。

分析问题:

我们知道json键的格式如下(,“ keyString” :),而json值是(:“ valueString”,)

keyString:是除(:“)以外的任何字符序列。

valueString:是除(“,)以外的任何字符序列。

我们的目标是转义valueString内的引号,以实现我们需要将keyStrings和valueStrings分开。

  • 但是我们也有一个像这样的有效json格式(“ keyString”:digit,),这会引起问题,因为它打破了假设值总是以(“,)结尾的假设
  • 另一个问题是具有空值,例如(“ keyString”:“”)

现在,在分析问题之后,我们可以说

  1. json keyString前面有(,“),后面有(” :)。
  2. JSON的valueString可以具有(: “)之前和(”)后OR(:)之前和(,)后的数字作为一个值,则OR然后(:),接着(”“)(,)

解决方案:使用此事实,代码将是

function escapeJsonValues($json_str){
  $patern = '~(?:,\s*"((?:.(?!"\s*:))+.)"\s*(?=\:))(?:\:\s*(?:(\d+)|("\s*")|(?:"((?!\s*")(?:.(?!"\s*,))+.)")))~';
  //remove { }
  $json_str = rtrim(trim(trim($json_str),'{'),'}');
  if(strlen($json_str)<5) {
    //not valid json string;
    return null;
  }
  //put , at the start nad the end of the string
  $json_str = ($json_str[strlen($json_str)-1] ===',') ?','.$json_str :','.$json_str.',';
  //strip all new lines from the string
  $json_str=preg_replace('~[\r\n\t]~','',$json_str); 

  preg_match_all($patern, $json_str, $matches);
  $json='{';
  for($i=0;$i<count($matches[0]);$i++){

        $json.='"'.$matches[1][$i].'":';
        //value is digit
        if(strlen($matches[2][$i])>0){
            $json.=$matches[2][$i].',';
        } 
        //no value
        elseif (strlen($matches[3][$i])>0) {
            $json.='"",';
        }
        //text, and now we can see if there is quotations it will be related to the text not json
        //so we can add slashes safely
        //also foreword slashes should be escaped 
        else{
            $json.='"'.str_replace(['\\','"' ],['/','\"'],$matches[4][$i]).'",';
        }
  }
  return trim(rtrim($json,','),',').'}';
}

注意:该代码实现空格。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PHP双引号字符串问题

preg_match一个带有单引号或双引号的php字符串,转义于其中

用PHP中的JSON字符串中的单引号替换双引号

为什么字符串插值只适用于双引号 PHP

PHP在json字符串中的变量前后添加双引号

php的json_encode()是否总是使用双引号作为字符串定界符?

如何使用php匹配双引号字符串

PHP解析逗号分隔的字符串,带双引号

无法从字符串PHP中删除双引号

PHP将双引号字符串转换为单引号字符串

PHP如何在字符串的双引号和不带双引号的单词前添加加号(+)字符

PHP正在努力删除包含双引号的JSON字符串的一部分

PHP:如何分配大字符串的单引号和双引号

PHP中的单引号和双引号字符串有什么区别?

PHP:带有单引号和双引号的复杂字符串

如何在双引号php字符串中插入php变量

如何在 JSON 字符串中转义双引号

有没有办法在PHP双引号字符串使用功能?

php&javascript警报,其中包含带双引号的字符串

PHP Carbon 在双引号字符串中添加动态对象属性

带有双引号的php字符串反而用反斜杠代替

如何在字符串PHP中双引号后添加逗号?

我如何通过使用php只获取双引号字符串

将带有双引号的字符串作为参数从 php 传递到 javascript

如何从php中的字符串中省略双引号和数组括号

在 PHP 中重新格式化字符串以添加双引号和反斜杠

字符串中的双引号转义

PHP转义JSON字符串保存在var中

php:字符串被双引号引起来,而不是单引号引起来。怎么修?