【发布时间】:2010-10-22 00:25:52
【问题描述】:
我正在搜索我的数据库。如果用户输入例如。 “foo bar” 我想显示同时包含“foo”和“bar”的行。
我的 SQL 语法如下所示: SELECT * FROM t1 WHERE MATCH (t1.foo_desc, t2.bar_desc) 反对 ('+foo* +bar*')
如何使用 PHP 中的正则表达式将用户输入的“foo bar”更改为“+foo* +bar*”?
【问题讨论】:
我正在搜索我的数据库。如果用户输入例如。 “foo bar” 我想显示同时包含“foo”和“bar”的行。
我的 SQL 语法如下所示: SELECT * FROM t1 WHERE MATCH (t1.foo_desc, t2.bar_desc) 反对 ('+foo* +bar*')
如何使用 PHP 中的正则表达式将用户输入的“foo bar”更改为“+foo* +bar*”?
【问题讨论】:
我会使用正则表达式将两个单词之间的空格替换为* +:
'+' . preg_replace('/\s+/', '* +', trim($input)) . '*'
编辑 基本上这是what Tomalak said的实现,只是使用\s而不是\W。
【讨论】:
对于那些对 MATCH...AGAINST 语法感兴趣的人,This article 是一个不错的起点,如果您以前没有使用过它。
【讨论】:
$match = '+' . implode('* +', explode(' ', $input)) . '*';
这假设输入不是空字符串;
编辑:正如@Bart S 指出的那样,str_replace(或 mb_str_replace,如果您正在处理多字节字符)会更简单......
$match = '+' . str_replace(' ', '* +', $input) . '*';
【讨论】:
首先,修剪用户输入并删除任何奇怪的东西(标点符号、引号,基本上所有"\W",当然除了空白)。
然后,替换:
(?<=\w)\b
与
"*"
和:
\b(?=\w)
与
"+"
【讨论】:
您应该使用\b 和\B 来识别单词/非单词边界,从而插入您的+/*。
【讨论】: