13

我有一个匹配 MySQL 中的一个字段,我认为我可以使用正则表达式,但似乎 MySQL 没有我需要的功能来完成这项工作。这是场景:

我在 PHP 中有一个名为 $url 的变量。假设这个变量被设置为字符串“/article/my-article/page/2”。我在 MySQL 中还有一个 URL 表,我想从中提取内容。但是,存储在我的表中的 URL 包含通配符。

以前,我进行了这样的设置,以便存储在表中的值如下所示:“/article/%/page/%”。

使用该配置,我可以运行:

SELECT * FROM urls WHERE '$url' LIKE url

这将匹配,这是所需的功能。

我现在想做的是允许一个更高级的通配符,这样我的 MySQL 数据可以是“/article/{{slug}}/page/{{”而不是“/article/%/page/%” page_no}}”。

我想创建一个与此数据匹配的 SQL 查询,使用相同的 $url 输入。LIKE 不再是正确的比较,因为我没有使用内置的“%”通配符,而是 {{.*}}。任何想法如何做到这一点?

4

5 回答 5

6

有一个用户定义函数库,可以在 MySQL 中为您提供 preg_replace: http ://www.mysqludf.org/lib_mysqludf_preg/

于 2011-07-31T15:54:20.587 回答
5

听起来您想要做的是在数据库中使用新语法,其中 URL 具有您将传递给基于 php(sprintf)的变量替换代码的占位符,但仍然能够进行原始比较以匹配 URL。

如果我理解正确,您想采用新的 URL 格式

/article/{{slug}}/page/{{page_no}}

并将其与类似的东西相匹配

/article/my-article/page/2

提到的 preg 插件 sagi 可以进行您需要的替换,这会将您新格式化的 URL 之一转换为您用于使用 LIKE 语法确定匹配的原始格式。以下查询:

SELECT PREG_REPLACE('/({{.*?}})/', '%', `url`) FROM urls;

会将新的 url (/article/{{slug}}/page/{{page_no}}) 变成原来的

/article/%/page/%

然后可以通过您的原始查询反馈,如下所示:

SELECT * FROM urls
WHERE '/article/my-article/page/2' LIKE preg_replace('/({{.*?}})/', '%', `url`);

一些二进制发行版如 MAMP、XAMMP 等已经安装了插件,但它没有安装在 Macports / Ubuntu 等很多系统上。这里有几篇关于安装 preg 插件的文章。希望能帮助到你。

http://quickshiftin.com/blog/2011/04/installing-mysql-preg-plugin-osx-macports/

http://quickshiftin.com/blog/2011/12/installing-the-mysql-preg-plugin-on-ubuntu-with-apt-get/

于 2011-12-04T02:44:50.260 回答
3

上面的用户sagi提到了http://www.mysqludf.org/lib_mysqludf_preg/但由于这个答案和大多数教程一样非常古老,为了这个问题的新手,我想对此进行扩展。

首先,图书馆真的很棒,从经验来看,我可以说它似乎得到了维护,并且在 2015 年仍在完美运行。

为了安装和运行它,我只能找到一些非常过时的教程,所以我想我会分享我所做的对我在 Ubuntu 14.04 上安装最新稳定版本 (v1.1) 有用的东西:

apt-get update
apt-get install libpcre3-dev libmysqlclient-dev build-essential libmysqld-dev libpcre3-dev
wget https://github.com/mysqludf/lib_mysqludf_preg/archive/lib_mysqludf_preg-1.1.tar.gz
tar -xzf lib_mysqludf_preg-1.1.tar.gz
cd lib_mysqludf_preg-1.1
./configure
make  install
make installdb
service mysql restart

您现在应该可以使用以下所有功能:

lib_mysqludf_preg_info
preg_capture
preg_check
preg_replace
preg_rlike
preg_position
于 2015-04-07T19:40:08.157 回答
0

从 mysql 5.5 开始,您可以使用RLIKE

  • 要么以 REGEXP 样式存储 url,然后使用

    SELECT * FROM urls WHERE '$url' RLIKE url ;

  • 或保持 LIKE 风格,并进行替换(% by .* , _ by .):

    SELECT * FROM urls WHERE '$url' RLIKE REPLACE(REPLACE(url, '%', '.*'), '_', '.') ;

    要完整,您必须进行其他替换来转义正则表达式显着的字符:?\ () [] ...(见 php 函数preg_quote

于 2017-11-03T15:38:30.987 回答
-1

I've found a solution. It's not ideal, but I'll put it in here in case a pure SQL solution never surfaces. I can leave the url field in MySQL equal to "/articles/%/page/%" and add another field called variables that stores a list of variable names to be used. That way I can use my original query, then replace the "%" characters in the return value with "{{variable}}" in PHP with sprintf after I've retrieved the data.

Still, I'd like to see this solved in SQL if possible, since I think the concept is valuable.

于 2009-11-10T03:46:05.920 回答