Php 使用正则表达式分组将搜索字符串转换为(my)SQL where子句
我想为我的网页开发一个简单的搜索,它使用PHP和MySQL数据库,我认为使用一个文本字段是一个好主意,在这个字段中,用户可以输入一个基本的搜索词,支持Php 使用正则表达式分组将搜索字符串转换为(my)SQL where子句,php,sql,regex,grouping,Php,Sql,Regex,Grouping,我想为我的网页开发一个简单的搜索,它使用PHP和MySQL数据库,我认为使用一个文本字段是一个好主意,在这个字段中,用户可以输入一个基本的搜索词,支持或,-和“。我不想使用多个表单输入,只想使用一个文本字段来获得更好的用户体验,就像谷歌一样 其想法是编写一个解析器,使用正则表达式提取所有子搜索组,然后从这些子搜索组构建SQL语句 因此,有效的搜索词及其子组是 abc->['a','b','c'] ab或c->['a','b或c'] a-b->['a','-b'] a“bc”->['a','bc'
或,-
和“
。我不想使用多个表单输入,只想使用一个文本字段来获得更好的用户体验,就像谷歌一样
其想法是编写一个解析器,使用正则表达式提取所有子搜索组,然后从这些子搜索组构建SQL语句
因此,有效的搜索词及其子组是
abc
->['a','b','c']
ab或c
->['a','b或c']
a-b
->['a','-b']
a“bc”
->['a','bc']
ab或c-d
->['a','b或c','d']
a“bc”-d
->['a','bc','d']
a“bc”或d-e
->['a','bc'或d','e']
a“bc”或d或“ef”-g
->['a','bc'或d或“ef”,'g']
然后,可以使用结果组动态创建where子句
我尝试使用regex([\-a-z])|(\“[a-z\s]+\”)
进行分组,但在使用或进行分组时失败,这可能会发生两次或多次(参见最后一个示例)。您可以使用
(?:"[^"]*"|\S+)(?:\s+OR\s+(?:"[^"]*"|\S+))*
见
详细信息
(?:“[^”]*”|\S+
-a“…”
子字符串或1+非空格
(?:\s+或\s+(?:“[^”]*“|\s+))*
-0+序列:
\s+或\s+
-或
包含1+空格的子字符串
(?:“[^”]*”|\S+
-a“…”
子字符串或1+非空格
注意:如果“…”
子字符串可以有转义序列,则需要根据转义字符来更改表达式的该部分。的工作方式就像一个符咒!