PHP: регулярное выражение в JSON вызывает проблемы для json_decode?

5
задан Bharata 22 January 2019 в 09:19
поделиться

3 ответа

Ваша строка "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:

0
ответ дан Bharata 22 January 2019 в 09:19
поделиться

Когда вы пишете "\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" добро пожаловать в побег из ада.

0
ответ дан Sammitch 22 January 2019 в 09:19
поделиться

Из-за потенциально сложного регулярного выражения и проблемы двойного экранирования вы не получаете ожидаемый строковый литерал.

Это должно работать для любого регулярного выражения:

$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"
0
ответ дан Boy 22 January 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: