【问题标题】:Parse String Array of regex values within PHP在 PHP 中解析正则表达式值的字符串数组
【发布时间】:2017-05-07 02:41:45
【问题描述】:

我的工作方式组合很复杂,我找不到任何关于如何完成它的参考。

我允许用户在数据库 (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;

问题是,我在$obs->unq; 上得到了Notice: Trying to get property of non-object in...

我猜这与正则表达式的存储方式有关,但我不确定。浪费了太多时间,感谢您的帮助。

【问题讨论】:

  • 您的问题“不清楚”。首先阅读how to ask,并学习阅读您​​的错误...为什么要从给定值的数组中获取对象属性???
  • 我不是故意不小心给你的评论投票的。你没有看我的问题。请在投反对票之前完整阅读。正如您在$val - '{"unq":'.$val.'}'; 行中看到的那样,我将其转换为对象,以便我可以利用 json 转换为对象形式。我希望通过$obj->unq;检索数组这是怎么回事???
  • 已回答!我刚刚对你的目的的起源做了更多的解释(字符串正则表达式的需要,你用来做它的方式......等等)。我赞成您的评论以平衡,直到可以编辑您的帖子以恢复投票;-)

标签: php arrays json regex string


【解决方案1】:

您的解析器(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"]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2019-08-03
    • 2021-10-05
    • 2015-07-31
    • 2011-10-14
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多