MySQL有没有类似于PHP的preg_replace函数的等效函数?

13

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

我在PHP中有一个名为 $url 的变量。假设这个变量被设置为字符串 "/article/my-article/page/2"。我还有一个存储URL的MySQL表,我希望能够从中获取内容。然而,我的表中存储的URL包括通配符。

之前,我将表中存储的值设置为:"/article/%/page/%"。

通过这种配置,我只需要运行:

SELECT * FROM urls WHERE '$url' LIKE url

这样可以匹配,这是想要的功能。

现在我想做的是允许更高级的通配符,使得我的MySQL数据可以是"/article/{{slug}}/page/{{page_no}}",而不是"/article/%/page/%"。

我想创建一个SQL查询来匹配这些数据,使用相同的$url输入。由于我不再使用内置的"%"通配符,而是使用{{.*}},所以LIKE不再是正确的比较方法。有什么想法可以实现这个目标吗?

5个回答

6

5

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

如果我理解正确,你想采用一种新的URL格式。

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

并将其与类似的内容进行匹配

/article/my-article/page/2

Sagi提到的preg插件可以进行您需要的替换,它将把您新格式的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/

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

在 https://github.com/mysqludf/lib_mysqludf_preg/blob/testing/INSTALL 上的 Github 安装文档中也有一套相当不错的安装说明。 - Slam

0

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

  • 将url以REGEXP格式存储,并使用以下方式查询:

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

  • 或者以LIKE样式保存它,并进行替换(%用.*替换,_用.替换):

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

    为了完整起见,您还需要进行其他替换以转义正则表达式特殊字符:? \ () [] ... (请参阅php函数 preg_quote


-1

我已经找到了一个解决方案。虽然不是理想的,但我会在这里放置它,以防纯SQL解决方案不可用。我可以将MySQL中的URL字段设置为“/articles/%/page/%”,并添加另一个称为variables的字段,该字段存储要使用的变量名称列表。这样,我就可以使用原始查询,然后在PHP中使用sprintf将返回值中的“%”字符替换为“{{variable}}”。

不过,如果可能的话,我仍希望在SQL中解决此问题,因为我认为这个概念是有价值的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接