2012-05-06 55 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

相關問題