我有来自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 字符。
答案 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"
}
答案 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.