PHP - 从JSON响应中删除\ n

时间:2017-11-28 12:54:55

标签: php json newline

我有来自API调用的(简化的)JSON响应,如下所示

{"status":true,"action_values":"{\n \"range_from\": \"0\",\n \"range_to\": \"0\"\n}"}

我正在尝试使用PHP从上面删除 \ n 字符,但它似乎无法正常工作。

我试试:

$trimmed = str_replace("\n", "", $response);

$ response 是我的JSON字符串,如上所示。但这不会删除/替换 \ n 字符。

2 个答案:

答案 0 :(得分:7)

无需删除\n /新行。

相反,您应该使用json_decode()对字符串进行解码,然后您可以解码range_from值,该值也是原始json中的json编码:

<?php
$str = '{"status":true,"action_values":"{\n \"range_from\": \"0\",\n \"range_to\": \"0\"\n}"}';

$dec = json_decode($str, true);

var_dump(json_decode($dec['action_values'], true));

结果:

array(2) {
  ["range_from"]=>
  string(1) "0"
  ["range_to"]=>
  string(1) "0"
}

An example

答案 1 :(得分:1)

我会推荐@jeroen的解决方案,因为它使用PHP本机函数来处理JSON。

但是,既然您已经问过,我觉得您并不完全理解为什么您的解决方案不起作用。

正如@ B001的评论中已经指出的那样,你需要&#34; \\ n&#34;完成这项任务:

$trimmed = str_replace("\\n", "", $response);

原因是,&#34; \ n&#34;表示&#34; \\ n&#34;时的新行字符。表示字符串&#34; \ n&#34;。

尝试以下代码,您将看到差异

 print("-----");
 print("\n"); 
 print("-----");
 print("\\n");
 print("-----");
 print("\"");

这将产生以下输出:

 -----
 -----\n-----"

这样做的原因是&#34; \&#34;代码中的字符,启动一个控制字符。这方面的例子是&#34; \ n&#34;对于换行,&#34; \ r&#34;回车,&#34; \ t&#34;对于标签,\&#34;对于&#34;&#34;定义的字符串中的&#34; -character;和&#34; \\&#34;对于实际的反斜杠字符。

因此,如果要创建包含\ n的实际字符串,则必须告诉解释器您实际上需要\ _字符而不是由\创建的控制字符以及后面的字符。这是通过使用双反斜杠和#34; \\&#34;这是实际反斜杠字符串的字符串表示形式。这被称为&#34;逃避&#34;。

在你的情况下,你的$ response变量中有实际的字符串,因此你必须使用转义字符作为模式。

最后让我解释一下&#34; \ n&#34;和&#39; \ n&#39;。 PHP有两种创建字符串的方法:

 $str1 = "hello \n world\n";
 $str2 = 'hello \n world\n';
 print($str1);
 print($str2);

两个变量都将包含一个字符串,但是,&#34; -string表示PHP解释器应该解释包含的字符串,而&#39; -string为您提供字符串。上面的例子会产生以下输出:

 hello
 world
 hello \n world\n

这表明以下代码也会剥离\ n实例的字符串,因为&#39; \ n&#39;将包含实际字符串而不是控制字符:

 $trimmed = str_replace('\n', "", $response);

对&#34; -string的这种解释甚至允许将变量插入到字符串中:

 $name = "Daniel";
 $age = 18;
 $sentence = "My Friend $name is $age years old.";
 print($sentence);

并且会导致:

 My Friend Daniel is 18 years old.