我正在使用的方式的组合很复杂,我找不到任何关于如何实现它的参考。
我允许用户在数据库(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;
我猜这与正则表达式的存储方式有关,但我不确定。感谢您的帮助,浪费了太多时间。
答案 0 :(得分:0)
它似乎是你的解析器(mysqli_real_escaped_string或其他东西)不会转义json字符串中预期的任何结构字符(我猜的unicode字符除外)
正如您所读到的JSON RFC about strings escaping slashes(向前或向后)应该被转义!
“字符串的表示类似于C中使用的约定 编程语言家族“
然后,您可以使用addcslashes来转义它:
$reg = addcslashes($reg, chr(0x5c)); // hex notation, beware of '\\'
$out = '{"unq":'.$reg.'}';
$out = json_decode($out);
您应该使用本机调试函数(如var_dump和json错误处理程序)来确保发生错误的位置:
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"]);