【问题标题】:how do i get PHP / REGEXP to match all keywords, instead of any?我如何让 PHP / REGEX 匹配所有关键字,而不是任何关键字?
【发布时间】:2012-05-06 20:25:21
【问题描述】:

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

以下是代码:

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

非常感谢任何帮助!

【问题讨论】:

    标签: php mysql regex search


    【解决方案1】:

    您最好将关键字放入规范化的子表中,这样可以使此类搜索变得微不足道。 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 ....
    

    【讨论】:

    • 是的,这就是问题所在。该脚本在前后有点复杂,有一些额外的东西阻止我使用 mySQL 命令:(
    【解决方案2】:

    你可以用你的关键字做这样的事情:

    $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

    【讨论】:

    • 如果$keywords_search 类似于a|b|c,则可能不起作用。即使只是其中一个关键字,它仍然会匹配。
    • 是的,这就是问题所在。该脚本在前后有点复杂,有一些额外的东西阻止我使用 mySQL 命令:(
    • 您是否考虑过使用 MySQL 的全文搜索?
    猜你喜欢
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多