[英]multi-word match in a mysqli string in php
我有一个看起来如下的数据库:
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');
当然哪个是“或”而不是“和”匹配,它匹配了1、3、5、6和7。
但是我想要匹配的是1和3。
我究竟做错了什么?
将模式更改为
REGEXP '(\blike\b|\beat\b)')
基本上, (a|b|c)
会匹配对象中任何地方的 a
或b
或c
。 在每个单词之前和之后添加\\b
(单词边界)可确保仅当单词出现在单词边界内(即空格,换行符或其他分隔符)时才产生匹配项。
但是, 在MySQL中,转义的特殊字符将替换为自定义标记。 对于单词边界,请使用[[:<:]]
和[[:>:]]
REGEXP '([[:<:]]like[[:>:]]|[[:<:]]eat[[:>:]])')
对于“或”而言,更为简洁:
REGEXP '[[:<:]](like|eat)[[:>:]]'
对于“ AND”:
REGEXP '[[:<:]]like[[:>:]]'
AND REGEXP '[[:<:]]eat[[:>:]]'
但是使用FULLTEXT
索引(也称为“ AND”)会更快
MATCH (col) AGAINST ('+like +eat' IN BOOLEAN MODE)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.