2012-05-06 27 views
1

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

以下是代码:

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

任何帮助,不胜感激!如果你能

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

$keywordQuery = []; 

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

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

比正则表达式更好,你也可以使用MySQL的全文搜索 - Boolean Full-Text Searches

回答

0

你可以做这样的事情与你的关键字。

+0

如果'$ keywords_search'类似'a | b | c',可能不会起作用。即使只有一个关键字仍然可以匹配。 –

+0

是的,这是问题所在。这个脚本前后有点复杂,其他的东西让我无法使用mySQL命令:( – user1227914

+0

)你有没有研究过使用MySQL的全文搜索呢? –

1

你最好把你的关键字放到一个标准化的子表中,这样可以使这样的搜索变得微不足道。 MySQL的正则表达式匹配不允许你指定应该匹配多少个系列的变化,它只是告诉你它们是否匹配。

e.g

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 .... 
+0

是的,这是问题。脚本有点复杂阻止我使用mySQL命令的东西:( – user1227914

相关问题