如何将正则表达式模式存储在 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.
我的应用程序由多个微服务组成,我现在正在处理 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.