问题 有没有相当于PHP的preg_replace的MySQL?
我有一个匹配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不再是正确的比较,因为我没有使用内置的“%”通配符,而是使用{{。*}}。任何想法如何实现这一目标?
5867
2017-11-10 03:17
起源
答案:
6
2017-07-31 15:54
听起来你想要做的是在数据库中使用新的语法,其中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;
将新网址(/ 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/
4
2017-12-04 02:44
答案:
6
2017-07-31 15:54
听起来你想要做的是在数据库中使用新的语法,其中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;
将新网址(/ 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/
4
2017-12-04 02:44
用户 鹭 以上提及 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
3
2018-04-07 19:40
从mysql 5.5开始,你可以使用 RLIKE :
要么以REGEXP样式存储URL,要么使用查询
SELECT * FROM urls WHERE'$ url' RLIKE网址;
或者保持LIKE风格,并进行替换(%by。*,_ by。):
SELECT * FROM urls WHERE'$ url' RLIKE REPLACE(REPLACE(url,'%','。*'),'_','。');
要完成,你必须做其他替换来逃避正则有效的字符:? \()[] ...(参见php函数 preg_quote)
0
2017-11-03 15:38
我找到了解决方案。它并不理想,但我会把它放在这里,以防纯粹的SQL解决方案永远不会出现。我可以让MySQL中的url字段等于“/ articles /%/ page /%”,并添加另一个名为变量的字段,用于存储要使用的变量名列表。这样我可以使用我的原始查询,然后在我检索数据后用PHP中的“{{variable}}”替换回复值中的“%”字符和sprintf。
尽管如此,我还是希望看到这在SQL中得到解决,因为我认为这个概念很有价值。
-1
2017-11-10 03:46