使用Regex提取MySQL查询

时间:2017-09-07 08:47:27

标签: php mysql

我想提取查询并像这样分离到数组 enter image description here

我的问题是我需要[from => account_admin]并且[join => ['LEFT JOIN account_admin_role_relation ON account_admin.id = account_admin_role_relation.admin_id', 'LEFT JOIN account_admin_role ON account_admin_role_relation.admin_role_id = account_admin_role.id']]

这是我的进步:

$query = '
    SELECT account_admin.id, account_admin.name, email, account_admin_role.name AS role FROM account_admin
    LEFT JOIN account_admin_role_relation ON account_admin.id = account_admin_role_relation.admin_id
    LEFT JOIN account_admin_role ON account_admin_role_relation.admin_role_id = account_admin_role.id
    WHERE status = 1
    GROUP BY account_admin.id
';

$matches = null;

$regex_value = '(?:\w++|`[^`]*+`|"(?:[^"\\\\]++|\\\\.)*+"|\'(?:[^\'\\\\]++|\\\\.)*+\'|\s++|[^`"\'\w\s])*?';
preg_match('/^\s*(?:\bSELECT\b\s*(' . $regex_value . '))?(?:\bFROM\b\s*(' . $regex_value . '))?(?:\bWHERE\b\s*(' . $regex_value . '))?(?:\bGROUP\s+BY\b\s*(' . $regex_value . '))?(?:\bORDER\s+BY\b\s*(' . $regex_value . '))?(?:\bLIMIT\b\s*(' . $regex_value . '))?(?:;|$)/si', $query, $matches);

$parts = array_combine(['query', 'select', 'from', 'where', 'group', 'order', 'limit'], $matches + array_fill(0, 7, ''));

if (preg_match_all('/(LEFT|INNER|OUTER|RIGHT)?\sJOIN((?:(?!\sJOIN).)+)/i', 'FROM ' . $parts['from'], $matches)) {
    $parts['join'] = $matches[0];
}

if (preg_match('/FROM\s+(.+)/i', 'FROM ' . $parts['from'], $matches)) {
    $parts['from'] = $matches[1];
}

print_r($parts);

编辑:我只是寻找简单的数组作为输出因为我只是使用简单的查询选择..来自..加入..其中..组...订单..限制

0 个答案:

没有答案