Parse String Массив значений регулярных выражений в переполнении стека

Сочетание того, как я работаю с этим, является сложным, и я не могу найти никаких ссылок на то, как этого добиться.

Я разрешаю пользователю хранить представление массива значений регулярных выражений в базе данных (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;

Я предполагаю, что это связано с тем, как хранится регулярное выражение, но я не уверен. Слишком много потраченных часов на это, спасибо за вашу помощь.

1

Решение

Кажется, ваш парсер (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"]);
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector