抓取字符串的特定部分

时间:2021-07-29 07:51:33

标签: php

我有一个包含用户访问过滤器的表。这些过滤器包含一个特定的 MySQL 范围,用户可以在其中搜索数据,例如:

start_time >= '2021-07-29 12:00' AND end_time <= '2021-07-30 12:00' AND customer_id = '12' AND wipe_status = 'SUCCESS'

所有这些都存储在一个字符串中。我希望将字符串分开,以便在这种情况下得到以下内容:

$end_time = end_time <= '2021-07-30 12:00'
$customer_id = customer_id = '12'
$wipe_status = wipe_status = 'SUCCESS'

问题是这些的长度是可变的,所以我不确定如何使用子字符串来分隔这些。有时过滤器也会包含和“OR”,所以我不能简单地用 AND 分隔。你对我将如何做这件事有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我更喜欢创建一个字典,其键对应于 WHERE 子句中的列。我们可以对 ANDOR 进行正则表达式拆分,然后迭代这些术语以填充字典。

$input = "start_time >= '2021-07-29 12:00' AND end_time <= '2021-07-30 12:00' AND customer_id = '12' AND wipe_status = 'SUCCESS'";
$parts = preg_split("/\s+(?:AND|OR)\s+/", $input);
$vals = array();
foreach ($parts as $part) {
    $vals[explode(" ", $part)[0]] = $part;
}
print_r($vals);

打印:

Array
(
    [start_time] => start_time >= '2021-07-29 12:00'
    [end_time] => end_time <= '2021-07-30 12:00'
    [customer_id] => customer_id = '12'
    [wipe_status] => wipe_status = 'SUCCESS'
)

答案 1 :(得分:1)

如果您愿意,可以使用 explode 来执行此操作。一个例子是:

$source = "start_time >= '2021-07-29 12:00' AND end_time <= '2021-07-30 12:00' AND customer_id = '12' AND wipe_status = 'SUCCESS'";

$output = array();
foreach (explode(" AND ", $source) as $value) {
  foreach (explode(" OR ", $value) as $value2) {
    $output[] = $value2;
  }
}

var_dump($output);

这将输出:

array(4)
{
    [0]=> string(32) "start_time >= '2021-07-29 12:00'" 
    [1]=> string(30) "end_time <= '2021-07-30 12:00'" 
    [2]=> string(18) "customer_id = '12'" 
    [3]=> string(23) "wipe_status = 'SUCCESS'" 
}

这将根据要求适用于 ANDOR

重要说明:explode 区分大小写。如果使用了非大写的 ANDOR,那么这将不起作用。如果没有保证的情况,更好的选择是使用已在答案中显示的正则表达式方法 preg_split