php中mysqli字符串中的多词匹配

php中mysqli字符串中的多词匹配,php,mysql,regex,mysqli,Php,Mysql,Regex,Mysqli,我有一个类似于以下内容的数据库: ID | TEXT 1 | I like to eat cheetos. 2 | There is a snake in my boots 3 | to eat is to like food 4 | The sun stopped setting, Rlyah Cthullhu! 5 | Beat the heat with icecram! 6 | Treat yourself! 7 | Eat at Joe

我有一个类似于以下内容的数据库:

ID   |   TEXT
1    | I like to eat cheetos.
2    | There is a snake in my boots
3    | to eat is to like food
4    | The sun stopped setting, Rlyah Cthullhu!
5    | Beat the heat with icecram!
6    | Treat yourself!
7    | Eat at Joes!
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/^(^like|^eat)/');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '(like)(eat)');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/(?=like)(?=eat)/');
我有一个mysqli查询,看起来有点像下面的

SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/(like)(eat)/');
我还尝试了以下方法:

ID   |   TEXT
1    | I like to eat cheetos.
2    | There is a snake in my boots
3    | to eat is to like food
4    | The sun stopped setting, Rlyah Cthullhu!
5    | Beat the heat with icecram!
6    | Treat yourself!
7    | Eat at Joes!
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/^(^like|^eat)/');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '(like)(eat)');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/(?=like)(?=eat)/');
这些都不符合任何领域(据我所知,我也不知道为什么它们会起作用)。出于绝望,我试着

SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP 'like|eat');
当然是“或”而不是“和”匹配,它匹配1、3、5、6和7

但我希望它匹配的是1和3

我做错了什么?

将模式更改为

REGEXP '(\blike\b|\beat\b)')
基本上,
(a | b | c)
将匹配主题中的任何位置。在每个单词前后添加
\b
(单词边界)可确保仅当单词出现在单词边界内(即空格、换行符或其他分隔符)时才生成匹配项

但是,转义的特殊字符将替换为自定义标记。对于单词边界,请使用
[[::]]

REGEXP '([[:<:]]like[[:>:]]|[[:<:]]eat[[:>:]])')
REGEXP'([[::]|[[::]]))

对于“或”更为简洁:


您应该研究使用全文搜索。请尝试
REGEXP'(\blike\b | \beat\b)
也许:像“%LIKE%”和“%eat%”这样的文本为什么ID列会小于1?这似乎是一个非常奇怪的限制。@rtfm我正在尝试使用正则表达式来实现它,因为从我正在解析的数组中手工生成文本要容易一些,否则,我确信这会起作用。只要尝试一下,它也会返回一个空集。而且,我想要的是喜欢和吃,而不仅仅是喜欢或吃。(我将更新原始帖子以更清楚地说明)我猜部分问题可能与mysql对正则表达式的解释有关?因为我已经尝试过其他应该有效的方法,但是没有。它在同一行匹配like和eat,但前提是它们是单独的单词,而不是另一个单词的一部分。我匹配过,但在mysql中使用时不匹配。另外,它只需要在两者都存在的情况下匹配。对不起,在MySQL中,特殊标记会接管模式中的转义控制字符。看到我的更新。巨大的改进!仍然需要得到它,所以它需要匹配所有变量,而不仅仅是至少一个。。。我们将通过包含^symbols来尝试,因为现在可能可以使用了。
MATCH (col) AGAINST ('+like +eat' IN BOOLEAN MODE)