我如何让PHP / REGEX匹配所有关键字,而不是任何?

时间:2012-05-06 20:25:21

标签: php mysql regex search

我有一个PHP / mySQL搜索功能,在$ keywords_search值中使用一个或多个关键字。问题是它匹配任何关键字,这意味着如果搜索完成,它返回的结果只包含“牛奶”或只是“啤酒”,如果有人搜索“牛奶啤酒”。如何更改它以使结果必须包含字符串中的所有关键字?

以下是代码:

$query[] = "((a.name REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*') 
OR (a.description REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*'))";

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

将关键字放入规范化的子表中会更好,这使得这些搜索变得微不足道。 MySQL的正则表达式匹配不允许您指定应该匹配的一系列替换中的多少,它只是告诉您是否有任何匹配。

e.g

SELECT count(*) AS cnt
FROM keywords
WHERE keyword IN ('a', 'b', 'c')
GROUP BY id
HAVING (cnt = 3)

只会显示任何特定ID都包含所有三个关键字的记录。

使用正则表达式版本和未规范化的字符串字段,您必须将关键字拆分为多个单独的正则表达式,并使用AND链接它们

e.g。

SELECT ...
FROM ...
WHERE keyword REGEX ('keyword1') AND keyword REGEX ('keyword2') AND ....

答案 1 :(得分:0)

您可以使用关键字执行以下操作:

$keywords = array('key', 'word');

$keywordQuery = [];

foreach ($keywords as $keyword) {
    $keywordQuery[] = "((a.name REGEXP '( )*({$keyword})( )*') AND (a.description REGEXP '( )*({$keyword})( )*'))";
}

$query = implode(' AND ', $keywordQuery);

比Regexp更好,如果可以的话,你也可以使用MySQL的全文搜索 - Boolean Full-Text Searches