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

bybem2ql  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(306)

我有一个数据库,看起来有点像:

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!

我有一个mysqli查询,看起来有点像下面的。。。

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)/');

这些都不符合任何领域(我也不知道为什么,据我所知,他们应该工作)。出于绝望,我试着。。。

SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP 'like|eat');

当然是“or”而不是“and”匹配,它匹配1,3,5,6和7。
但我希望它匹配的是1和3。
我做错什么了?

3pvhb19x

3pvhb19x1#

将图案改为

REGEXP '(\blike\b|\beat\b)')

基本上, (a|b|c) 将匹配 a 或者 b 或者 c 在这个主题的任何地方。添加 \b (单词边界)在每个单词前后确保仅当单词出现在单词边界内(即空格、换行符或其他分隔符)时才产生匹配。
然而,在mysql中,转义的特殊字符被替换为自定义标记。对于单词边界,使用 [[:<:]] 以及 [[:>:]] ```
REGEXP '(:<:like:>:|:<:eat:>:)')

https://regex101.com/r/dxij6q/1
du7egjpx

du7egjpx2#

对于“或”更为简洁:

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

对于“和”:

REGEXP '[[:<:]]like[[:>:]]'
AND REGEXP '[[:<:]]eat[[:>:]]'

但是 FULLTEXT 索引(也叫“and”)会快得多

MATCH (col) AGAINST ('+like +eat' IN BOOLEAN MODE)

相关问题