在MySQL中存储带有通配符的URL并返回匹配项

时间:2016-09-07 12:05:25

标签: php mysql regex routing wildcard

我正在编写一个PHP路由器,它使用这样的查询在数据库中查找页面的id

SELECT `id` FROM `pages` WHERE '/about/test' REGEXP `url` ORDER BY `url`

来自这样的表

id  type_id url             name    lookup  
1   0       /about/[^/]*    NULL    NULL
2   1       /about/company  NULL    NULL

所以它在2上获得了'/about/company',在第一行结果上的1上获得了/about/whatever

我正在寻找从MySQL检索通配符值的最佳方法,例如通过'/about/[^/]+'时获取'test'条目的ID和'/about/test'作为第二个参数;并且在通过'/about/company'

时只获取ID

简单地说,我希望获得可变数量的列,其中第一列返回ID而其他列 - 正确顺序的通配符值

1 个答案:

答案 0 :(得分:0)

让我假设您有一个标志,指定某些内容是通配符模式还是简单比较。

如果你想要所有比赛,你可以这样做:

SELECT `id`
FROM `pages`
WHERE '/about/test' REGEXP `url` AND url_has_wildcard = 0
UNION ALL
SELECT `id`
FROM `pages`
WHERE '/about/test' REGEXP `url` AND url_has_wildcard = 1 AND
      NOT EXISTS (SELECT 1
                  FROM pages
                  WHERE '/about/test' REGEXP `url` AND url_has_wildcard = 0
                 );

您可以使用 - 还有什么 - 正则表达式来定义这样的标志。说,像这样:

WHERE '/about/test' REGEXP `url` AND
      (url REGEXP '^[a-zA-Z0-9/]*$') -- or whatever the valid characters are

如果只想返回一行,则可以执行以下操作:

SELECT `id`
FROM `pages`
WHERE '/about/test' REGEXP `url` 
ORDER BY (url REGEXP '^[a-zA-Z0-9/]*$') DESC
LIMIT 1;