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不再是正确的比较,因为我没有使用内置的"%"通配符,而是使用{{.*}}.任何想法如何实现这一目标?
听起来您想要做的是在数据库中使用新语法,其中 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 中得到解决,因为我认为这个概念很有价值。
| 归档时间: |
|
| 查看次数: |
44001 次 |
| 最近记录: |