Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让PHP/REGEXP匹配所有关键字,而不是任何关键字?_Php_Mysql_Regex_Search - Fatal编程技术网

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

如何让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

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

代码如下:

$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 ....