Ваша строка "Hello\s+World"
должна быть экранирована как "Hello\\\s+World"
. Первый побег \
предназначен для побега, второй побег \
сбежит \s
.
И затем, если вы хотите иметь массив в выводе, вы должны установить assoc = true
в качестве второго параметра для функции json_decode()
.
Подробнее о функции json_decode()
см. В документации .
Решение
См. DEMO из моего кода.
<?php
$json = '{"regex":["Hello\\\s+World"]}';
$obj1 = json_decode($json);
echo $obj1->regex[0]."<br>";
$obj2 = json_decode($json, true); //When assoc == TRUE, returned objects will be converted into associative arrays.
echo $obj2["regex"][0];
?>
Как экранировать все управляющие символы JSON:
Когда вы пишете "\s"
в PHP, буквальная строка равна \s
, потому что \s
не является допустимой escape-последовательностью.
Когда вы пишете "\\s"
в PHP, буквальная строка равна \s
, потому что \\
является допустимой escape-последовательностью.
JSON, с другой стороны, выдаст ошибку для недопустимых escape-последовательностей, что является вашей проблемой.
Решение: Не пишите JSON вручную.
$json = json_encode(['regex'=> ['Hello\s+World']]);
Вывод: {"regex":["Hello\\s+World"]}
[примечание: буквальная строка, допустимый JSON]
Плохое решение - это больше проблем, чем оно того стоит, и, вероятно, вызовет проблемы в дальнейшем: "Hello\\\s+World"
добро пожаловать в побег из ада.
Из-за потенциально сложного регулярного выражения и проблемы двойного экранирования вы не получаете ожидаемый строковый литерал.
Это должно работать для любого регулярного выражения:
$regex1 = <<<EOD
Hello\s+World
EOD;
$obj = new stdClass();
$obj->regex = array();
$obj->regex[] = $regex1;
$json = json_encode($obj);
$decoded = json_decode($json);
var_dump($decoded->regex[0]);
output :
string(13) "Hello\s+World"