我有一个匹配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不再是正确的比较,因为我没有使用内置的“%”通配符,而是使用{{。*}}。任何想法如何实现这一目标?
答案 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中得到解决,因为我认为这个概念很有价值。