如何让PHP/REGEXP匹配所有关键字,而不是任何关键字?
我有一个PHP/mySQL搜索函数,它在值$keywords\u搜索中使用一个或多个关键字。问题是它匹配任何关键字,这意味着如果搜索完成,它返回的结果要么只包含“牛奶”,要么只包含“啤酒”,如果有人搜索“牛奶啤酒”。如何更改它,使结果必须包含字符串中的所有关键字 代码如下:如何让PHP/REGEXP匹配所有关键字,而不是任何关键字?,php,mysql,regex,search,Php,Mysql,Regex,Search,我有一个PHP/mySQL搜索函数,它在值$keywords\u搜索中使用一个或多个关键字。问题是它匹配任何关键字,这意味着如果搜索完成,它返回的结果要么只包含“牛奶”,要么只包含“啤酒”,如果有人搜索“牛奶啤酒”。如何更改它,使结果必须包含字符串中的所有关键字 代码如下: $query[] = "((a.name REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*') OR (a.descriptio
$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);
与Regexp相比,如果可以的话,您还可以使用MySQL的全文搜索-。您可以使用关键字执行类似操作:
$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的全文搜索-。您最好将关键字放入规范化的子表中,这使得此类搜索变得微不足道。MySQL的正则表达式匹配不允许您指定一系列替换中有多少个应该匹配,它只是告诉您其中是否有匹配的 e、 g 将只显示任何特定id都有三个关键字的记录 使用正则表达式版本和未规范化的字符串字段,您必须将关键字拆分为多个单独的正则表达式,并使用
和
e、 g
您最好将关键字放入一个规范化的子表中,这使得此类搜索变得微不足道。MySQL的正则表达式匹配不允许您指定一系列替换中有多少个应该匹配,它只是告诉您其中是否有匹配的
e、 g
将只显示任何特定id都有三个关键字的记录
使用正则表达式版本和未规范化的字符串字段,您必须将关键字拆分为多个单独的正则表达式,并使用和
e、 g
如果$keywords\u search
类似于a | b | c
,则可能不起作用。即使只是其中一个关键词,它仍然匹配。是的,这就是问题所在。脚本在前后都有点复杂,还有一些额外的东西阻止我使用mySQL命令:(你考虑过使用MySQL的全文搜索吗?如果$keywords\u search
类似于a | b | c
,可能不会起作用。它甚至只会匹配一个关键字。是的,这就是问题所在。脚本前后都有点复杂,有额外的东西阻止我使用MySQL命令:(你考虑过使用MySQL的全文搜索吗?是的,这就是问题所在。脚本前后都有点复杂,有其他东西阻止我使用MySQL命令:(是的,这就是问题所在。脚本前后都有点复杂,有其他东西阻止我使用MySQL命令:(
SELECT ...
FROM ...
WHERE keyword REGEX ('keyword1') AND keyword REGEX ('keyword2') AND ....