Parse String PHP

时间:2017-05-07 02:41:46

标签: php arrays json regex 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 个答案:

答案 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"]);