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

Tra*_*vis 12 php regex mysql replace preg-replace

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

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

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

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

SELECT * FROM urls WHERE '$url' LIKE url
Run Code Online (Sandbox Code Playgroud)

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

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

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

sag*_*agi 6

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


qui*_*tin 5

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

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

/article/{{slug}}/page/{{page_no}}
Run Code Online (Sandbox Code Playgroud)

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

/article/my-article/page/2
Run Code Online (Sandbox Code Playgroud)

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

SELECT PREG_REPLACE('/({{.*?}})/', '%', `url`) FROM urls;
Run Code Online (Sandbox Code Playgroud)

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

/article/%/page/%
Run Code Online (Sandbox Code Playgroud)

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

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

一些二进制发行版如 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/


Tra*_*vis -1

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

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