我有一个 PHP/mySQL 搜索函数,它在值 $keywords_search 中使用一个或多个关键字。问题是它匹配任何关键字,这意味着如果完成搜索,如果有人搜索“牛奶啤酒”,它返回的结果要么只包含“牛奶”,要么只包含“啤酒”。如何更改它以便结果必须包含字符串中的所有关键字?
代码如下:
$query[] = "((a.name REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*')
OR (a.description REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*'))";
非常感谢任何帮助!
最佳答案
您最好将关键字放入规范化的子表中,这样可以使此类搜索变得微不足道。 MySQL 的正则表达式匹配不允许您指定应匹配一系列交替中的多少,它只会告诉您是否匹配其中任何一个。
例如
SELECT count(*) AS cnt
FROM keywords
WHERE keyword IN ('a', 'b', 'c')
GROUP BY id
HAVING (cnt = 3)
只会显示任何特定 ID 都包含所有三个关键字的记录。
使用正则表达式版本和非规范化字符串字段,您必须将关键字拆分为多个单独的正则表达式,并使用 AND
例如
SELECT ...
FROM ...
WHERE keyword REGEX ('keyword1') AND keyword REGEX ('keyword2') AND ....
关于php - 我如何让 PHP/REGEX 匹配所有关键字,而不是任何关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473990/