Php 使用正则表达式分组将搜索字符串转换为(my)SQL where子句

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'

我想为我的网页开发一个简单的搜索,它使用PHP和MySQL数据库,我认为使用一个文本字段是一个好主意,在这个字段中,用户可以输入一个基本的搜索词,支持
-
。我不想使用多个表单输入,只想使用一个文本字段来获得更好的用户体验,就像谷歌一样

其想法是编写一个解析器,使用正则表达式提取所有子搜索组,然后从这些子搜索组构建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+非空格

注意:如果
“…”
子字符串可以有转义序列,则需要根据转义字符来更改表达式的该部分。

的工作方式就像一个符咒!