Сочетание того, как я работаю с этим, является сложным, и я не могу найти никаких ссылок на то, как этого добиться.
Я разрешаю пользователю хранить представление массива значений регулярных выражений в базе данных (MySql) следующим образом:
'["/^\d{5}([\-]?\d{4})?$/i", "/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/i"]'
Теперь в моем коде PHP я прочитал его в переменную $val
и это выглядит так:
'["/^\\d{5}([\\-]?\\d{4})?$/i", "/^([ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ])\\ {0,1}(\\d[ABCEGHJKLMNPRSTVWXYZ]\\d)$/i"]'
и пытается использовать JSON для декодирования его в реальный массив:
$val = '{"unq":'.$val.'}';
$obs = json_decode($val);
return $obs->unq;
Проблема в том, что я получаю Notice: Trying to get property of non-object in...
на $obs->unq;
Я предполагаю, что это связано с тем, как хранится регулярное выражение, но я не уверен. Слишком много потраченных часов на это, спасибо за вашу помощь.
Кажется, ваш парсер (mysqli_real_escaped_string или что-то еще) не экранирует структурные символы, ожидаемые в строке json (за исключением символов unicode, которые я предполагаю)
Как вы можете прочитать в JSON RFC о строках, выходящих из слеша (вперед или назад) следует избегать!
«Представление строк похоже на соглашения, используемые в C
семейство языков программирования «
Затем вы можете использовать addcslashes, чтобы избежать этого:
$reg = addcslashes($reg, chr(0x5c)); // hex notation, beware of '\\'
$out = '{"unq":'.$reg.'}';
$out = json_decode($out);
Вы должны использовать встроенные функции отладки, такие как var_dump и json error handler, чтобы гарантировать, откуда произошла ошибка:
var_dump(json_last_error_msg(), $out);
return $out->unq;
по ошибке:
string(12) "Syntax error"NULL
решил:
string(8) "No error"object(stdClass)#1 (1) {
["unq"]=>
array(2) {
[0]=>
string(23) "/^\d{5}([\-]?\d{4})?$/i"[1]=>
string(86) "/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/i"}
}
Я не знаю о вашей цели, но есть другой способ помочь этому королю хранилища.
Вы также можете сериализовать истинный массив регулярных выражений
// before saving
$patterns = serialize
([
"/^\d{5}([\-]?\d{4})?$/i",
"/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/i",
]);
// usage out of mysql, unserialize do the tricks
return $patterns = unserialize($sqlressource["patterns"]);
Других решений пока нет …