有没有相当于PHP的preg_replace的MySQL?

时间:2009-11-10 03:17:15

标签: php mysql regex replace preg-replace

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

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

以前,我进行了此设置,以便存储在表格中的值如下所示:“/ article /%/ page /%".

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

SELECT * FROM urls WHERE '$url' LIKE url

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

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

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

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

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

并将其与

之类的内容进行匹配
/article/my-article/page/2

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

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

将新网址(/ 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/

答案 2 :(得分:3)

上面的用户 sagi 提到了http://www.mysqludf.org/lib_mysqludf_preg/,但由于这个答案与大多数教程一样非常陈旧,我想为了这个问题的新人而扩展这个。< / p>

首先,图书馆非常棒,从经验来看,我可以说它似乎已经得到了维护,并且在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

答案 3 :(得分:0)

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

  • 以REGEXP样式存储网址,并使用

    进行查询

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

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

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

    要完成,你必须做其他替换来逃避正则有效的字符:? \()[] ...(参见php function preg_quote

答案 4 :(得分:-1)

我找到了解决方案。它并不理想,但我会把它放在这里,以防纯粹的SQL解决方案永远不会出现。我可以让MySQL中的url字段等于“/ articles /%/ page /%”,并添加另一个名为变量的字段,用于存储要使用的变量名列表。这样我可以使用我的原始查询,然后在我检索数据后用sprintf将PHP中的“{{variable}}”中的“%”字符替换为。{/ p>

但是,如果可能的话,我希望看到这在SQL中得到解决,因为我认为这个概念很有价值。