如何将正则表达式模式存储在 MySQL 字段中并检查输入?

How can I store a regex pattern in a MySQL field and check an input against it?

我的应用程序由多个微服务组成,我现在正在处理 API 网关和授权微服务。每个传入请求都将根据用户执行此操作的权限进行验证和授权 activity。 activity 由一个动词 (GET, POST, PUT, DELETE) 和一个 ENDPOINT (/interpretations/q44nAj91aH6nd/)

组成

我有一个 MySQL table 列出所有活动,并希望将用户请求的端点与 table 中匹配的 activity(行)相匹配。

    CREATE TABLE `activities` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `url` varchar(255) NOT NULL DEFAULT '',
      `method` varchar(20) NOT NULL DEFAULT 'GET',
      `url_regex` varchar(255) DEFAULT '',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    INSERT INTO `activities` (`id`, `url`, `method`, `url_regex`)
    VALUES
        (1,'/interpretations/','POST',''),
        (2,'','GET','/interpretations/[a-Z0-9]+/');

我的问题是,如何匹配给定请求端点的第 2 行:/interpretations/q44nAj91aH6nd/(应匹配正则表达式模式 /interpretations/[a-Z0-9]+/)。

当我尝试以下操作时,它不起作用:

SELECT * FROM `activities` WHERE `url_regex` RLIKE "/interpretations/q44nAj91aH6nd/";

# also tried inverting

SELECT * FROM `activities` WHERE "/interpretations/q44nAj91aH6nd/" RLIKE `url_regex`;

在 MySQl 中,正则表达式模式出现在 RLIKE 之后,输入数据出现在之前,因此:

SELECT * FROM `activities` WHERE "/interpretations/q44nAj91aH6nd/" RLIKE `url_regex`;

PS,您的正则表达式在字符范围内有语法错误。试试这个:

/interpretations/[a-zA-Z0-9]+/

首先测试您的正则表达式,将输入和模式作为直接字符串传递:

SELECT * FROM `activities` WHERE  '/interpretations/q44nAj91aH6nd/' RLIKE  '/interpretations/[a-Z0-9]+/';

给出"invalid character range"。你在查询中看不到这个,因为模式错误不会停止查询,它只是删除行

一些 testing/demo 可用在:http://sqlfiddle.com/#!9/82e917/2

RLIKE 关心参数的顺序。尝试:

SELECT *
FROM `activities`
WHERE '/interpretations/q44nAj91aH6nd/' RLIKE url_regex;

将正则表达式更改为:

INSERT INTO `activities` (`id`, `url`, `method`, `url_regex`)
    VALUES (1, '/interpretations/', 'POST', ''),
           (2, '', 'GET', '/interpretations/[a-zA-Z0-9]+/');

Here 是 SQL Fiddle.